spring三方包类注入容器的四种方法

如果引用第三方jar包,肯定是不能直接使用常用注解@Controller、@Service、@Repository、@Component将类的实例注入到spring容器中。以下四种方法可以向spring容器中导入三方包中类实例 。

1 xml配置

这种情况大家用的比较多,就是在spring的xml文件中配置需要导入的bean。在springweb项目工程web.xml中 ContextLoaderListener或者DispatcherServlet的初始参数contextConfigLocation指定spring配置文件位置,可以在该配置文件中直接定义bean,或者在该配置文件中import专门配置三方bean的xml文件。springboot工程,可以在启动类上面加注解@ImportResource。@ImportResource注解可以通过value指定需要扫描的xml文件,value是字符串数组可以指定多个xml配置文件。

@SpringBootApplication
@ImportResource(value = {"classpath:spring-bean.xml"})
public class DubboOneApplication {

    public static void main(String[] args) {
        SpringApplication.run(DubboOneApplication.class, args);
    }
}

2 @Configuration和@Bean

可以通过直接直接向spring容器注入bean。在开启注解扫描的情况下,在扫描的包路径中添加具有@Configuration注解的类,在该类的定义返回某个实例的方法,这个方法加上@Bean的注解,那么这个方法的返回值将注入spring容器,这个bean的名称是这个方法的名称。

3 @Import

@Import可以直接向容器中导入第三方包中bean。在开启注解扫描的情况下,可以在有@Controller,@Service,@Component,@Repository,@Configuration注解的类上面添加@Import注解,@Import注解有一个类数组类型的属性,类数组中的类有以下四种情况

  • 普通的类名称,该类被注入容器,bean名称是全类名
@SpringBootApplication
@Import({TestTwo.class})
public class DubboOneApplication {

    public static void main(String[] args) {
        SpringApplication.run(DubboOneApplication.class, args);
    }
}
  • 具有Configuration作用的类,没有@Configuration注解,里面定义了具有@Bean注解的方法,例如上面TestTwo中有一个返回TestThree的方法使用了@Bean注解,那么TestThree也会注入进容器,bean名称就是方法名,和@Configuration注入功能类似。
  • ImportSelector实现类,该接口具有一个方法,方法的返回值是字符串数组,每一项是全类名,通过参数AnnotationMetadata可以得到这个被@Import注解修饰类的信息。同样这样注入进来的bean的名称也是全类名,可以返回空数组,不可以返回null。第一种直接写注入类名和使用ImportSelector实现类,都没有办法使用注入类的有参构造方法,bean的名称也没有办法指定,不过只单实例自动注入,不用关心bean名称。
public interface ImportSelector {

	/**
	 * Select and return the names of which class(es) should be imported based on
	 * the {@link AnnotationMetadata} of the importing @{@link Configuration} class.
	 */
	String[] selectImports(AnnotationMetadata importingClassMetadata);

}
  • ImportBeanDefinitionRegistrar实现类,该类有个方法可以直接向Application中手动注入bean,我们可以简单定义一个bean然后注入。
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
    RootBeanDefinition definition = new RootBeanDefinition(TestFive.class);
    registry.registerBeanDefinition("testTive",definition);
 }

4 @FactoryBean

FactoryBean可以用来实现代理,原始的代理实现就可以使用ProxyFactoryBean,还有专门用来实现事务代理的TransactionProxyFactoryBean。使用注解和配置的方式和一般bean一样向容器中注入一个FactoryBean的实现类,实际注入的该FactoryBean中getObject方法返回的对象,这个bean的名称还是对应配置或注解中指定的名称。

@Component("testFive")
public class TestFour implements FactoryBean{
    @Override
    public boolean isSingleton() {
        return true;
    }

    @Override
    public TestFive getObject() throws Exception {
        return new TestFive();
    }

    @Override
    public Class getObjectType() {
        return TestFive.class;
    }
}

 

你可能感兴趣的:(spring)