
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等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)