注入bean的方式
1 xml 注入
@Data
public class UserEnity {
private String id;
private String name;
@Override
public String toString() {
return "UserEnity{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
'}';
}
public UserEnity(String id, String name) {
this.id = id;
this.name = name;
}
}
<bean id="userEnity" class="org.wenhao.v1.enity.UserEnity">
<constructor-arg index="0" value="id"/>
<constructor-arg index="1" value="name"/>
<property name="id" value="10"/>
<property name="name" value="wenhao"/>
</bean>
public class TestSpring {
private static ClassPathXmlApplicationContext applicationContext;
public static void main(String[] args) {
applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
UserEnity userEnity = applicationContext.getBean("userEnity", UserEnity.class);
System.out.println(userEnity.toString());
}
}
2 @Configuration @ComponentScan注解注入
/**
* 此处的 Configuration 如同 applicationContext.xml 配置文件
*/
@Configuration
//包含
/*@ComponentScan(value = "org.wenhao.v2", includeFilters =
{@ComponentScan.Filter
(type = FilterType.ANNOTATION, classes = Service.class)}, useDefaultFilters = false)*/
//不包含
@ComponentScan(value = "org.wenhao.v2",
excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION,
classes = Service.class)}, useDefaultFilters = true)
public class SpringConfig {
/**
* 只有将外部的类加载到spring 容器 才使用 @bean
*
* @return
*/
@Bean
public UserEnity userEnity() {
return new UserEnity("123", "lisi");
}
}
public class TestSpring {
private static AnnotationConfigApplicationContext context;
public static void main(String[] args) {
System.out.println("加载配置文件开始。。。");
context = new AnnotationConfigApplicationContext(SpringConfig.class);
System.out.println("加载配置文件结束。。。");
/*UserEnity userEnity = context.getBean("userEnity", UserEnity.class);
System.out.println(userEnity.toString());
UserService userService = context.getBean("userService", UserService.class);
System.out.println(userService);
String[] beanDefinitionNames = context.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
System.out.println(beanDefinitionName);
}*/
/*UserService userService1 = context.getBean("userService", UserService.class);
UserService userService2 = context.getBean("userService", UserService.class);
System.out.println(userService1 == userService2);*/
String[] beanDefinitionNames = context.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
System.out.println(beanDefinitionName);
}
}
}
3 @Import @Bean 注解注入 以及@Conditional使用方法
/**
* @Import 等同于 @Bean 但是两者还是有所区别的 @Import 再获取时,需要使用全限定名
* 而@bean 可以直接通过方法名获取对象
* 共同的应用场景都是引入外部jar包
*/
@Configuration
@Import(Win10Enity.class)
public class MyConfig {
/*@Bean
@Conditional(MyCondtion.class)
public Win10Enity win10Enity() {
return new Win10Enity();
}*/
}
public class MyCondtion implements Condition {
@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
Environment environment = conditionContext.getEnvironment();
String os_name = environment.getProperty("os.name");
if ("Windows 10".equals(os_name)){
return true;
}
return false;
}
}
public class TestSpring {
private static AnnotationConfigApplicationContext context;
public static void main(String[] args) {
context = new AnnotationConfigApplicationContext(MyConfig.class);
//Win10Enity win10Enity = (Win10Enity) context.getBean("win10Enity"); 使用@bean注解时,采用该种方法
Win10Enity win10Enity = (Win10Enity) context.getBean("org.wenhao.v3.enity.Win10Enity"); //使用@import时采用的方法
System.out.println(win10Enity);
}
}
4 EnableXXXX的实现
/**
* 之所以EnableXXX能生效 是因为再该注解中加入了 @Import(XXX.class),这时可以
* 把相关配置类加载入spring ioc容器中进行使用了
*/
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(MyEnity.class)
public @interface EnableMyEnity {
}
@Configuration
@EnableMyEnity
public class MyConfig {
}
5 实现 ImportSelector 注入
public class MyImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
return new String[]{"org.wenhao.v5.domain.V5MyEnity", "org.wenhao.v5.domain.V5YouEnity"};
}
}
@Configuration
@Import(MyImportSelector.class)
public class MyConfig {
}
6 实现 ImportBeanDefinitionRegistrar
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry registry) {
RootBeanDefinition root = new RootBeanDefinition(MyEnity.class);
registry.registerBeanDefinition("myEnity", root);
}
}
@Configuration
@Import(MyImportBeanDefinitionRegistrar.class)
public class MyConfig {
}
7 通过实现 FactoryBean方式
public class MyFactoryBean implements FactoryBean<MyEnity> {
@Override
public MyEnity getObject() throws Exception {
return new MyEnity();
}
@Override
public Class<?> getObjectType() {
return MyEnity.class;
}
@Override
public boolean isSingleton() {
return false;
}
}
@Configuration
@Import(MyFactoryBean.class)
public class MyConfig {
}
public class V7Test {
static AnnotationConfigApplicationContext context;
public static void main(String[] args) {
context = new AnnotationConfigApplicationContext(MyConfig.class);
MyEnity MyEnity1 = (MyEnity) context.getBean("org.wenhao.v7.config.MyFactoryBean");
MyEnity MyEnity2 = (MyEnity) context.getBean("org.wenhao.v7.config.MyFactoryBean");
System.out.println(MyEnity1 == MyEnity2);
String[] beanDefinitionNames = context.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
System.out.println(beanDefinitionName);
}
}
}
8 自定义注解方式
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface MyKit {
}
@Configuration
@ComponentScan(value = "org.wenhao.v8.domain")
public class MyConfig {
}
@MyKit
public class MaEnity {
}
public class V8Test {
static AnnotationConfigApplicationContext context;
public static void main(String[] args) {
context = new AnnotationConfigApplicationContext(MyConfig.class);
String[] beanDefinitionNames = context.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
System.out.println(beanDefinitionName);
}
}
}