多平台统一管理软件接口,如何实现多平台统一管理软件接口
427
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小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~