spring的上下文可以同时获取两个bean对象吗

spring的上下文可以同时获取两个bean对象吗,第1张

spring的上下文可以同时获取两个bean。spring项目,在相同的上下文中创建两个springbean。需要在单独的Configuration文件和单独的访问中创建。bean对象的创建,是靠注解,想要在代码里面,不是使用注解获取到bean对象,而是在上下文对象里面获取到bean对象,项目起动,就扫描注解,让被注解的类,创建bean对象,放到spring容器里面,从容器里面获取到对象。

不用配置xml,直接java代码实现,参考代码如下:

public class GetApplicationContext {

private static class ApplicationContextHolder {

// 单例变量

private static ApplicationContext AC = new FileSystemXmlApplicationContext(

"classpath:applicationContextxml");

}

// 私有化的构造方法,保证外部的类不能通过构造器来实例化。

private GetApplicationContext() {

}

// 获取单例对象实例

public static ApplicationContext getInstance() {

if (ApplicationContextHolderAC == null) {

ApplicationContextHolderAC = new FileSystemXmlApplicationContext(

"classpath:applicationContextxml");

}

return ApplicationContextHolderAC;

}

}

获取所有spring自动装配的bean:

<span style="font-size:18px;">//获取spring装配的bean个数

GetApplicationContextgetInstance()getBeanDefinitionNames()length;

//逐个打印出spring自动装配的bean。根据我的测试,类名第一个字母小写即bean的名字

for(int i=0;i<33;i++){

Systemoutprintln( GetApplicationContextgetInstance()getBeanDefinitionNames()[i]);

}</span>

然后通过下面的代码获取到spring注解装配的bean供自己使用:

<span style="font-size:18px;">StorageReturnService ossService = (StorageReturnService) GetApplicationContextgetInstance()getBean("storageReturnServiceImpl");</span>

首先,获取的 bean 的时候要保证或取得的 bean 必须携带 spring 容器注入的属性,这里举一个简单的例子:

以 dao,service,action 这三种常见的数据模型,业务模型,控制器来举例子,(当然你使用 spring mvc 都是一样的,只不过省掉了 action,但都是控制器,你懂得):

如果jsp 视图需要接受一个 service 的 bean,必须要保证该 service 的 bean 中含有 注入的 dao 属性,这个懂吧?,如果直接在 jsp 中 new(实例化对象),这样将会丢失属性的,因为内存区域完全开辟了新的堆空间,跟 spring 容器所管理的 bean 完全不是一个,那么问题就来了,怎么样才能简单的得到这个拥有注入属性的 bean 呢?

可以尝试将该 bean 封装为控制器(controller)中的一个成员(属性),之后通过web 容器内置的request ,session ,application 等作用域来进行封装,这就是简单的解决办法了

只要搜一下“获取 spring bean”,获取spring bean的N中方法都出来了。线程中获取和普通类中获取方法是一样的。

下面是一种方法。这个类需要配置在Spring中。

使用的时候直接:Bean bean = SpringUtilgetBean("bean的id",  Beanclass);//Beanclass是bean的类对象,比如获取 UserService的bean,就是:

UserService us = SpringUtilgetBean("userService", UserServiceclass);import orgspringframeworkbeansBeansException;

import orgspringframeworkcontextApplicationContext;

import orgspringframeworkcontextApplicationContextAware;

/

  Spring IOC上下文工具类

  @ClassName: SpringUtil 

  @Description: 

  @author 

  @date 2014-6-21 下午02:06:48 

 /

public class SpringUtil implements ApplicationContextAware {

    /

      当前IOC

     /

    private static ApplicationContext applicationContext;

    /

      设置当前上下文环境,此方法由spring自动装配

     /

    public void setApplicationContext(ApplicationContext arg0)

            throws BeansException {

        applicationContext = arg0;

    }

    /

      从当前IOC获取bean

      @param id

                 bean的id

      @return

     /

    public static <T> T getBean(String id, Class<T> requiredType) {

        T t = applicationContextgetBean(id, requiredType);

        return t;

    }

}

getBean是用来获取applicationContextxml文件里bean的,()写的是bean的id。

一种是singleton,一种是prototype,默认的是singleton,这种定义的bean实例的作用是与spring的容器一致的,只有spring容器初始化,调用getBean得到的singleton实例始终是同一个bean的实例spring定义的bean有两种作用范围,是每当调用getBean得到实例的时候spring都会new一个实例来给你,而prototype的实例。

你先找到标注了@SpringBootApplication的主类,注意看它的package。这个@SpringBootApplication会声明让Spring去扫描该package里以及所有子package里的类,如果扫到的类标注有@Component/@Controller/@Service/@Repository,那就把它加入Spring容器,这样你在其他任何地方使用@Autowired标注就能自动从Spring容器里把这个类找出来并注入进去直接使用。

package comdemo;

@SpringBootApplication

public class Application {

//

}

1 在Spring Boot可以扫描的包下

假设我们编写的工具类为SpringUtil。

如果我们编写的SpringUtil在Spring Boot可以扫描的包下或者使用@ComponentScan引入自定义的包了,那么原理很简单,只需要使得SpringUtil实现接口:ApplicationContextAware,然后加上@Component 注解即可,具体编码如下:

comkfitbaseutilSpringUtil:

package comkfitbaseutil;

import orgspringframeworkbeansBeansException;

import orgspringframeworkcontextApplicationContext;

import orgspringframeworkcontextApplicationContextAware;

import orgspringframeworkstereotypeComponent;

/

普通类调用Spring bean对象:

说明:

1、此类需要放到Appjava同包或者子包下才能被扫描,否则失效。

@author Administrator

/

@Component

publicclass SpringUtil implements ApplicationContextAware{

privatestatic ApplicationContext applicationContext = null;

@Override

publicvoid setApplicationContext(ApplicationContext applicationContext) throwsBeansException {

if(SpringUtilapplicationContext == null){

SpringUtilapplicationContext = applicationContext;

}

Systemoutprintln("---------------------------------------------------------------------");

Systemoutprintln("---------------------------------------------------------------------");

Systemoutprintln("---------------comkfitbaseutilSpringUtil------------------------------------------------------");

Systemoutprintln("========ApplicationContext配置成功,在普通类可以通过调用SpringUtilsgetAppContext()获取applicationContext对象,applicationContext="+SpringUtilapplicationContext+"========");

Systemoutprintln("---------------------------------------------------------------------");

}

//获取applicationContext

publicstatic ApplicationContext getApplicationContext() {

returnapplicationContext;

}

//通过name获取 Bean

publicstatic Object getBean(String name){

return getApplicationContext()getBean(name);

}

//通过class获取Bean

publicstatic <T> T getBean(Class<T> clazz){

return getApplicationContext()getBean(clazz);

}

//通过name,以及Clazz返回指定的Bean

publicstatic <T> T getBean(String name,Class<T> clazz){

return getApplicationContext()getBean(name, clazz);

}

}

启动应用,查看控制台的打印信息是否有:

======ApplicationContext配置成功,在普通类可以通过调用SpringUtilsgetAppContext()获取applicationContext对象,

2 不在Spring Boot的扫描包下方式一

这种情况处理起来也很简单,先编写SpringUtil类,同样需要实现接口:ApplicationContextAware,具体编码如下:

simplepluginspringSpringUtil

package simplepluginspring;

import orgspringframeworkbeansBeansException;

import orgspringframeworkcontextApplicationContext;

import orgspringframeworkcontextApplicationContextAware;

publicclass SpringUtil implements ApplicationContextAware{

privatestatic ApplicationContext applicationContext = null;

@Override

publicvoid setApplicationContext(ApplicationContext applicationContext) throwsBeansException {

if(SpringUtilapplicationContext == null){

SpringUtilapplicationContext = applicationContext;

}

Systemoutprintln("---------------------------------------------------------------------");

Systemoutprintln("---------------------------------------------------------------------");

Systemoutprintln("---------------simplepluginspringSpringUtil------------------------------------------------------");

Systemoutprintln("========ApplicationContext配置成功,在普通类可以通过调用SpringUtilsgetAppContext()获取applicationContext对象,applicationContext="+SpringUtilapplicationContext+"========");

Systemoutprintln("---------------------------------------------------------------------");

}

//获取applicationContext

publicstatic ApplicationContext getApplicationContext() {

returnapplicationContext;

}

//通过name获取 Bean

publicstatic Object getBean(String name){

return getApplicationContext()getBean(name);

}

//通过class获取Bean

publicstatic <T> T getBean(Class<T> clazz){

return getApplicationContext()getBean(clazz);

}

//通过name,以及Clazz返回指定的Bean

publicstatic <T> T getBean(String name,Class<T> clazz){

return getApplicationContext()getBean(name, clazz);

}

}

之后这一步才是关键,使用@Bean注解,在Appjava类中将SpringUtil注解进来,代码如下:

package comkfit;

import orgspringframeworkbootSpringApplication;

import orgspringframeworkbootautoconfigureSpringBootApplication;

import orgspringframeworkbootwebservletServletComponentScan;

import orgspringframeworkcontextannotationBean;

import orgspringframeworkcontextannotationImport;

import simplepluginspringSpringUtil;

/

Hello world!

/

//其中@SpringBootApplication申明让spring boot自动给程序进行必要的配置,等价于以默认属性使用@Configuration,@EnableAutoConfiguration和@ComponentScan

@SpringBootApplication

@ServletComponentScan

public class App {

/注册Spring Util

这里为了和上一个冲突,所以方面名为:springUtil2

实际中使用springUtil

/

@Bean

public SpringUtil springUtil2(){return new SpringUtil();}

/

参数里VM参数设置为:

-javaagent:\lib\springloaded-124RELEASEjar -noverify

@param args

/

public static void main(String[] args) {

SpringApplicationrun(Appclass, args);

}

}

3 不在Spring Boot的扫描包下方式二

代码基本和上面都是相同的,主要是在Appjava中使用@Import进行导入。

而且在SpringUtil是不需要添加@Component注解

@SpringBootApplication

@ServletComponentScan

@Import(value={SpringUtilclass})

publicclass App {

//省略其它代码

}

说明以上3中方式都生效了,这3中方式根据实际情况选择一种方式就可以了。

那么这样子在普通类既可以使用:

SpringUtilgetBean() 获取到Spring IOC容器中的bean。

当然也可以在Spring管理的类中使用:

@Resouce或者@Autowired 进行注入使用,当然我们这个类的核心是普通类可以调用spring的bean进行使用了,是不是很神奇呢。

先检查spring-servletxml和application-contextxml里扫描packet的时候是否都有扫描到

如果没问题就在@Controller @Service后面加上(name="xxxBean")

然后再用spring的web工厂getBean就能取到

以上就是关于spring的上下文可以同时获取两个bean对象吗全部的内容,包括:spring的上下文可以同时获取两个bean对象吗、如何获取spring 注解的bean、spring mvc里,jsp中怎么获取bean等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/web/9535572.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存