SpringWeb 获取 Bean - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jalena
V2EX    Java

SpringWeb 获取 Bean

  •  
  •   jalena 2017-05-09 22:21:43 +08:00 3247 次点击
    这是一个创建于 3152 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Spring 4.3.8

    配置: config/applicationContext.xml

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cOntext="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- 自动扫描注解,管理 bean --> <context:component-scan base-package="com.pay.service.*,com.pay.dao.*"/> <context:component-scan base-package="com.pay.model.*,com.pay.dto.*"/> <!-- 1.1 加载数据库配置文件 --> <context:property-placeholder location="classpath:jdbc.properties"/> <!-- 1.2 配置 Druid 数据源 --> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close"> <!-- 配置连接池属性 --> <property name="driverClassName" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> <!-- 配置初始化大小、最小、最大 --> <property name="initialSize" value="${initialSize}"/> <property name="minIdle" value="${minIdle}"/> <property name="maxActive" value="${maxActive}"/> <!-- 配置获取连接等待超时的时间 --> <property name="maxWait" value="60000"/> <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --> <property name="timeBetweenEvictionRunsMillis" value="60000"/> <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --> <property name="minEvictableIdleTimeMillis" value="300000"/> <property name="validationQuery" value="SELECT 'x'"/> <property name="testWhileIdle" value="true"/> <property name="testOnBorrow" value="false"/> <property name="testOnReturn" value="false"/> <!-- 打开 PSCache,并且指定每个连接上 PSCache 的大小 --> <property name="poolPreparedStatements" value="true"/> <property name="maxPoolPreparedStatementPerConnectionSize" value="20"/> <!-- 配置监控统计拦截的 filters,去掉后监控界面 sql 无法统计 --> <property name="filters" value="stat"/> </bean> <!-- 1.3 Spring 和 MyBatis 整合,配置 sqlSessionFactory --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 数据库连接池 --> <property name="dataSource" ref="dataSource"/> <!-- 配置 Mybatis 全局配置文件 --> <property name="configLocation" value="classpath:/config/mybatis-config.xml"/> <!-- 自动扫描 mapping.xml 文件 --> <property name="mapperLocations" value="classpath:/mapper/*.xml"/> </bean> <!-- 1.4 扫描 Dao 接口,Spring 会自动查找其下的类,注入到 spring 容器中 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!-- 扫描包路径,如果需要扫描多个包,中间使用半角逗号分割 --> <property name="basePackage" value="com.pay.dao"/> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/> </bean> <!-- 获取实体 bean 工具类 --> <bean id="beanFactoryUtil" class="com.pay.util.BeanFactoryUtil" lazy-init="false" scope="singleton"/> <!-- druid 日志 --> <bean id="logFilter" class="com.alibaba.druid.filter.logging.Slf4jLogFilter"> <property name="statementExecutableSqlLogEnable" value="true"/> </bean> <!-- 事务管理 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <!-- 配置事务的注解方式注入,开启对 Class 的动态代理功能 --> <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/> </beans> 

    config/applicationContext-mvc.xml

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cOntext="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd"> <!-- 自动扫描包,使 SpringMVC 认为包下用了 @controller 注解的类都是控制器 --> <context:component-scan base-package="com.pay.controller"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> <context:include-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice"/> </context:component-scan> <!-- 配置 SpringMVC --> <!-- 1.开启 SpringMVC 注解模式 --> <!-- 简化配置: (1)自动注册 DefaultAnootationHandlerMapping,AnotationMethodHandlerAdapter (2)提供一些列:数据绑定,数字和日期的 format @NumberFormat, @DateTimeFormat, xml,json 默认读写支持 --> <!-- 扩充了注解驱动,可以将请求参数绑定到控制器参数 --> <mvc:annotation-driven> <mvc:message-converters register-defaults="true"> <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/> <bean class="org.springframework.http.converter.FormHttpMessageConverter"/> <bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter"/> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <constructor-arg index="0" value="utf-8"/> <property name="supportedMediaTypes"> <list> <value>text/plain;charset=</value> </list> </property> </bean> <!-- 配置 Fastjson 支持 --> <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter"> <property name="supportedMediaTypes" value="application/json"/> </bean> </mvc:message-converters> </mvc:annotation-driven> <!-- 避免出现乱码 --> <!-- 2.静态资源默认 servlet 配置 (1)加入对静态资源的处理:js,gif,png (2)允许使用"/"做整体映射 --> <mvc:default-servlet-handler /> <mvc:resources mapping="/img/" location="resource/images"/> <mvc:resources mapping="/js/" location="resource/Javascript"/> <mvc:resources mapping="/css/" location="resource/css"/> <!-- 上传(Servlet3.1) --> <bean id="multipartResolver" class="org.springframework.web.multipart.support.StandardServletMultipartResolver" /> <!-- 3. 定义跳转文件的前后缀--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!--<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>--> <property name="prefix" value="/WEB-INF/pages/"/> <property name="suffix" value=".jsp"/> </bean> <!-- 拦截器 --> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/admin/**"/> <mvc:exclude-mapping path="/admin/logout"/> <bean id="adminInterceptor" class="com.pay.Interceptor.AdminInterceptor"/> </mvc:interceptor> </mvc:interceptors> </beans> 

    web.xml

    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1" metadata-complete="true"> <welcome-file-list> <welcome-file>admin/login</welcome-file> </welcome-file-list> <!-- 加载 Spring 容器 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:config/applicationContext.xml</param-value> </context-param> <!-- 防止 spring 内存溢出监听器 --> <listener> <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class> </listener> <!-- 配置 SpringMVC DispatcherServlet --> <servlet> <servlet-name>SpringMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:config/applicationContext-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> <async-supported>true</async-supported> <!--<multipart-config>--> <!--<location>/</location>--> <!--<max-file-size>2097152</max-file-size>--> <!--<max-request-size>4194304</max-request-size>--> <!--</multipart-config>--> </servlet> <servlet-mapping> <servlet-name>SpringMVC</servlet-name> <!-- 默认匹配所有的请求 --> <url-pattern>/</url-pattern> </servlet-mapping> <!-- 编码过滤器 --> <filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>utf-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 加载 log4j 的配置文件 log4j.properties --> <context-param> <param-name>log4jConfigLocation</param-name> <param-value>classpath:log4j.xml</param-value> </context-param>s <!-- Session 超时时间 (分钟)--> <session-config> <session-timeout>15</session-timeout> </session-config> </web-app> 

    写了一个 Bean 获取的工具类 com.pay.util.BeanFactoryUtil

    package com.pay.util; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Component; @Component public class BeanFactoryUtil implements ApplicationContextAware { public BeanFactoryUtil() { } // spring 上下文对象 private static ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicatiOnContext= applicationContext; } public static Object getBeanByName(String beanName) throws BeansException{ return applicationContext.getBean(beanName); } public static Object getBeanByClass(Object beanClass) throws BeansException{ return applicationContext.getBean(beanClass.getClass()); } public static <T> T getBeanByNameAndClass(String beanName, Class<T> requiredType) throws BeansException { return applicationContext.getBean(beanName, requiredType); } } 

    使用这个 util 获取 bean。。。直接报

    获取写法:

     @RequestMapping(value = "/admin/json") @ResponseBody public PaymentInfo json() { // PaymentInfo paymentInfo = BeanFactoryUtil.getBeanByNameAndClass("PaymentInfo",PaymentInfo.class); PaymentInfo paymentInfo = (PaymentInfo) BeanFactoryUtil.getBeanByClass(PaymentInfo.class); paymentInfo.setBookfees("aaaaaaaa"); paymentInfo.setDepartment("asdas"); paymentInfo.setDirection("vccccccccc"); return paymentInfo; } 
    javax.servlet.ServletException: org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'java.lang.Class<?>' available at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:146) at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132) at org.eclipse.jetty.server.Server.handle(Server.java:564) at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:317) at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:251) at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:279) at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:110) at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:124) at org.eclipse.jetty.util.thread.Invocable.invokePreferred(Invocable.java:128) at org.eclipse.jetty.util.thread.Invocable$InvocableExecutor.invoke(Invocable.java:222) at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:294) at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:199) at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:672) at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:590) at java.lang.Thread.run(Thread.java:745) 
    7 条回复    2017-05-16 00:00:42 +08:00
    jalena
        1
    jalena  
    OP
       2017-05-09 23:47:35 +08:00
    已经搞定!!
    包扫描不能用.*
    liangWL
        2
    liangWL  
       2017-05-10 08:28:57 +08:00
    楼主配置文件写的真好,能不能发一份,谢谢。新人小白,求罩!
    woshixiaohao1982
        3
    woshixiaohao1982  
       2017-05-10 14:54:09 +08:00
    @liangWL 建议 springboot 不要再去配置了了
    jalena
        4
    jalena  
    OP
       2017-05-11 11:37:37 +08:00
    @liangWL 来个邮箱。
    liangWL
        5
    liangWL  
       2017-05-12 08:47:56 +08:00
    @jalena 邮箱: [email protected] 多谢了
    liangWL
        6
    liangWL  
       2017-05-12 11:14:39 +08:00
    再次来谢谢楼主,收到了,谢谢你!!!
    tonyli
        7
    tonyli  
       2017-05-16 00:00:42 +08:00 via iPhone
    大佬,我们可以交个朋^_^
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     4363 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 10:02 PVG 18:02 LAX 02:02 JFK 05:02
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86