1.Spring 学习 注入Bean 方式

注入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);
        }
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值