我接触spring自动注入的时间并不长,依稀记得有一点,一个类里可以使用自动注入其他bean的前提是这个类本身的管理也是要交给spring容器的。你调用这个方法所在的类可能并不是由spring来管理的,也就是说采用@Autowired这种自动注入应该是无效的,在针对这种情形,spring确实提供这样一种途径,就是在无法自动注入的情况下,直接调用beanfactory去拿某个bean的实例,调用这样方法得到的实例是跟自动注入得到的实例是一样的。
但是如果你主动去new这样一个bean,那spring容器是不会帮助你把这个bean里的属性初始化好的。
如果可以直接自动注入,谁不想省事一点呢,以上基本是我个人一点浅薄的项目经验,希望对你有帮助。
getBean是用来获取applicationContextxml文件里bean的,()写的是bean的id。
一种是singleton,一种是prototype,默认的是singleton,这种定义的bean实例的作用是与spring的容器一致的,只有spring容器初始化,调用getBean得到的singleton实例始终是同一个bean的实例spring定义的bean有两种作用范围,是每当调用getBean得到实例的时候spring都会new一个实例来给你,而prototype的实例。
如何取得Spring管理的bean (请用第3种方法):
1、servlet方式加载时,
webxml
Xml代码
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>orgspringframeworkwebservletDispatcherServlet</servlet-class>
<init-param>
<param-name>contExtConfigLocation</param-name>
<param-value>classpath:/springMVCxml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
spring容器放在ServletContext中的key是orgspringframeworkwebservletFrameworkServletCONTEXTspringMVC
注意后面的springMVC,是你的servlet-name配置的值,注意适时修改。
Java代码
ServletContext sc=略
WebApplicationContext attr = (WebApplicationContext)scgetAttribute("orgspringframeworkwebservletFrameworkServletCONTEXTspringMVC");
2、listener方式加载时:
webxml
Xml代码
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext</param-value>
</context-param>
<listener>
<listener-class>orgspringframeworkwebcontextContextLoaderListener</listener-class>
</listener>
jsp/servlet可以这样取得
Java代码
ServletContext context = getServletContext();
WebApplicationContext applicationContext = WebApplicationContextUtils getWebApplicationContext(context);
3、通用的方法来了,神器啊,前的 1、2两种方法并不通用,可以抛弃了。
在配置文件中加入:
Xml代码
<!-- 用于持有ApplicationContext,可以使用SpringContextHoldergetBean('xxxx')的静态方法得到spring bean对象 -->
<bean class="comxxxxxSpringContextHolder" lazy-init="false" />
Java代码
import orgspringframeworkcontextApplicationContext;
import orgspringframeworkcontextApplicationContextAware;
/
以静态变量保存Spring ApplicationContext, 可在任何代码任何地方任何时候中取出ApplicaitonContext
/
public class SpringContextHolder implements ApplicationContextAware {
private static ApplicationContext applicationContext;
/
实现ApplicationContextAware接口的context注入函数, 将其存入静态变量
/
public void setApplicationContext(ApplicationContext applicationContext) {
SpringContextHolderapplicationContext = applicationContext; // NOSONAR
}
/
取得存储在静态变量中的ApplicationContext
/
public static ApplicationContext getApplicationContext() {
checkApplicationContext();
return applicationContext;
}
/
从静态变量ApplicationContext中取得Bean, 自动转型为所赋值对象的类型
/
@SuppressWarnings("unchecked")
public static <T> T getBean(String name) {
checkApplicationContext();
return (T) applicationContextgetBean(name);
}
/
从静态变量ApplicationContext中取得Bean, 自动转型为所赋值对象的类型
/
@SuppressWarnings("unchecked")
public static <T> T getBean(Class<T> clazz) {
checkApplicationContext();
return (T) applicationContextgetBeansOfType(clazz);
}
/
清除applicationContext静态变量
/
public static void cleanApplicationContext() {
applicationContext = null;
}
private static void checkApplicationContext() {
if (applicationContext == null) {
throw new IllegalStateException("applicaitonContext未注入,请在applicationContextxml中定义SpringContextHolder");
}
}
}
WebApplicationContext wac = WebApplicationContextUtilsgetRequiredWebApplicationContext(getServletContext()); 有WebApplicationContext 了对象了 spring托管的所有对象都可以拿到了。 当然不推荐这种方式,一般是注入的方式
从最后一段可以看出,是你的ImUserServiceImpljava类里面的29行有问题,而且后面说问题就出在BeanUtils这个方法上里有问题,所以是注入失败问题。使用注解配置试试看。
ApplicationContextAware
你可以实现这个接口,然后里面会有个方法,你定义一个属性,然后赋值给他就好了,类似这样:
ApplicationContext ctx;
public abstract void setApplicationContext(ApplicationContext applicationcontext)
throws BeansException{
thisctx = applicationcontext;
}
然后你用 ctxgetBean("" ) 应该就能获取到了
1、添加util方法:
package comhzcutil;
import orgspringframeworkbeansBeansException;
import orgspringframeworkcontextApplicationContext;
import orgspringframeworkcontextApplicationContextAware;
/
普通类调用Spring注解方式的Service层bean
Created by HZC on 2015/10/21
/
public class SpringBeanFactoryUtils implements ApplicationContextAware {
private static ApplicationContext appCtx;
/
此方法可以把ApplicationContext对象inject到当前类中作为一个静态成员变量。
@param applicationContext ApplicationContext 对象
@throws BeansException
@author hzc
/
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
appCtx = applicationContext;
}
/
获取ApplicationContext
@return
@author hzc
/
public static ApplicationContext getApplicationContext() {
return appCtx;
}
/
这是一个便利的方法,帮助我们快速得到一个BEAN
@param beanName bean的名字
@return 返回一个bean对象
@author hzc
/
public static Object getBean(String beanName) {
return appCtxgetBean(beanName);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
2、在spring的配置文件xml中添加
<bean id="springBeanFactoryUtils" class="comhaierutilSpringBeanFactoryUtils"/>
1
1
3、service方法
package comhzcserviceimpl;
import orgslf4jLogger;
import orgslf4jLoggerFactory;
import orgspringframeworkstereotypeService;
import orgspringframeworktransactionannotationTransactional;
import javaxannotationResource;
import javamathBigDecimal;
import javautilDate;
import javautilList;
/
Created by HZC on 2015/10/20
/
@Service("ckPayoffService")
public class CKPayoffServiceImpl implements ICKPayoffOrderService {
private static final Logger log = LoggerFactorygetLogger(CKPayoffServiceImplclass);
/
测试
@author HZC
@createDate 2015-10-21
/
@Override
@Transactional
public void calculatePayoff() {
Systemoutprintln("--------------------------gogogogogo---------------");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
4、使用
CKPayoffServiceImpl ckps = (CKPayoffServiceImpl) SpringBeanFactoryUtilsgetBean("ckPayoffService");
ckpscalculatePayoff();
1
2
1
2
在普通类中就可以调用service实例方法了,执行calculatePayoff方法,打印“————————–gogogogogo—————”
以上就是关于Spring不用注入获取bean,这样获取applicationContext.getBean()有什么好处吗全部的内容,包括:Spring不用注入获取bean,这样获取applicationContext.getBean()有什么好处吗、Spring 中 个getBean 的作用是什么、如何查看 spring注入的bean等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)