spring 之脱离容器管理创建的对象进行依赖注入

我们有时候也会遇到一些脱离spring容器创建的类实例,,如何把spring容器内的对象注入到这些类实例内呢。

我们可以用org.springframework.beans.factory.config.AutowireCapableBeanFactory.createBean(Class<?> beanClass, intautowireMode, boolean dependencyCheck) 来创建这个脱离容器的对象,该方法返回脱离容器创建的对象,只不过对象的创建交给spring了。

我们可以用(也许这情况比较多,因为此脱离容器创建的对象也许会有其它框架创建)org.springframework.beans.factory.config.AutowireCapableBeanFactory.autowireBean(Object existingBean),把this对象传进来。

代码示例:

/* * Copyright (C) 2014- now() The spring4-2015 Authors * * https://github.com/sdcuike * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package com.doctor.spring4.blog.code;import static org.junit.Assert.assertNotNull;import static org.junit.Assert.assertNull;import java.util.stream.Stream;import javax.annotation.Resource;import org.junit.Ignore;import org.junit.Rule;import org.junit.Test;import org.junit.rules.ExpectedException;import org.springframework.beans.factory.annotation.Autowire;import org.springframework.beans.factory.annotation.Configurable;import org.springframework.beans.factory.config.AutowireCapableBeanFactory;import org.springframework.context.ApplicationContext;import org.springframework.context.annotation.AnnotationConfigApplicationContext;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.EnableLoadTimeWeaving;import org.springframework.context.annotation.EnableLoadTimeWeaving.AspectJWeaving;import org.springframework.context.annotation.aspectj.EnableSpringConfigured;/** * Wire object dependencies outside a Spring Container->脱离容器管理创建的对象进行依赖注入 * * 脱离容器管理创建的对象进行依赖注入 * * @see <a href= ""> </a> * * @author doctor * * @time 2015年6月16日 上午9:33:54 */public class WireObjectDependenciesOutsideSpring {@Rulepublic ExpectedException expectedException = ExpectedException.none();/** * Instantiate the bean and then inject dependencies using AutoWireCapableBeanFactory.autowireBean(instance) * 看下输出容器内的所有bean,容器内并没有person对象。只是创建返回此对象,并对该对象内的依赖进行注入。 */@Testpublic void test_create_bean_and_inject_dependencies() {AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfig.class);Person person = (Person) applicationContext.getAutowireCapableBeanFactory().createBean(Person.class, AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE, false);assertNotNull(person.getContext());Stream.of(applicationContext.getBeanDefinitionNames()).forEach(System.out::println);applicationContext.close();}/** * Instantiate the bean and then inject dependencies using AutoWireCapableBeanFactory.autowireBean(instance) */@Testpublic void test_only_inject_dependencies() {AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfig.class);Person person = new Person();assertNull(person.getContext());applicationContext.getAutowireCapableBeanFactory().autowireBean(person);assertNotNull(person.getContext());Stream.of(applicationContext.getBeanDefinitionNames()).forEach(System.out::println);applicationContext.close();}@Configurationstatic class SpringConfig {}static class Person {@Resourceprivate ApplicationContext context;public ApplicationContext getContext() {return context;}}@Configuration@EnableSpringConfigured@EnableLoadTimeWeaving(aspectjWeaving = AspectJWeaving.ENABLED)static class SpringConfig2 {}@Configurable(autowire = Autowire.BY_TYPE, dependencyCheck = true)static class Person2 {@Resourceprivate ApplicationContext context;public ApplicationContext getContext() {return context;}}}

上述示例还有一个是用aop实现,不过要开启java选项之类的,网上还有在tomcat下报错的,没仔细学习。

参考:

如果没法忘记他,就不要忘记好了。真正的忘记,是不需要努力的。

spring 之脱离容器管理创建的对象进行依赖注入

相关文章:

你感兴趣的文章:

标签云: