Spring不用注入获取bean,这样获取applicationContext.getBean()有什么好处吗

Spring不用注入获取bean,这样获取applicationContext.getBean()有什么好处吗,第1张

我接触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等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9505508.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存