基于spring三方包类注入容器的四种方式小结

网友投稿 386 2022-11-20


基于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,我们可http://以简单定义一个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 Boot @Import注解(将指定类实例注入到IOC容器中)

[color=red][size=large][b]SpringBoot 的 @Import 用于将指定的类实例注入到Spring IOC Container中。[/b][/size][/color] SpringBoot 提供了 三种使用 @Import 将 类实例注入至 Spring IOC Container中 的实例。

1.直接注入

2.实现 ImportBeanDefinitionRegistrar 接口 注入

3.实现 ImportSelector 注入

[color=red][b]直接注入

[/b][/color]

Broker.java(无任何属性和实现)

package com.springBoot.entrance.importBean.direct;

public class Broker {

}

Customer.java(无任何属性和实现)

package com.springBoot.entrance.importBean.direct;

public class Customer {

}

ImportDirect.java

package com.springBoot.entrance.importBean.direct;

import org.springframework.context.annotation.Import;

import org.springframework.stereotype.Component;

@Component

@Import({Customer.class,Broker.class})

/**

*使用Import 将指定的类的实例注入至Spring 容器中

*/

public class ImportDirect {

}

[b][color=red]代码解读:使用 @Import({Customer.class,Broker.class}) 后 Customer 和 Broker类的实例将会被注入之Spring IOC Container中[/color][/b]

App.java

//import Direct 使用import 直接将指定的类实例注入至Spring 容器中

System.out.println(context.getBean(ImportDirect.class));

System.out.println(context.getBean(Customer.class));

System.out.println(context.getBean(Broker.class));


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Spring事务失效场景原理及解决方案
下一篇:springboot项目监控开发小用例(实例分析)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~