spring给容器注册组件 的几种方式

环境搭建:
   新建一个maven项目,引入依赖
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>4.3.7.RELEASE</version>
    </dependency>

创建一个简单的类Person
package com.yang.spring.domain;

public class Person {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Person() {
        System.out.println("我被初始化了............");
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

 

   

1.使用传统的xml进行配置
<bean id="xiaohui" class="com.yang.spring.domain.Person">
    <property name="name" value="yangxiaohui"></property>
    <property name="age" value="20"></property>
</bean>
创建一个测试类
public class App 
{
    public static void main( String[] args )
    {
        ApplicationContext ctx  = new ClassPathXmlApplicationContext("beans.xml");
        Person p = (Person) ctx.getBean("xiaohui");
        System.out.println(p);

    }
}

 

2.使用注解@Bean的方式
@Configuration
public class Configurate {
    @Bean
    public Person person(){
        return new Person("xiaoMing",22);
    }
}
public class App 
{
    public static void main( String[] args )
    {
        ApplicationContext ctx  = new AnnotationConfigApplicationContext(Configurate.class);
        Person p = (Person) ctx.getBean("person");
        System.out.println(p);

    }
}

 

3.使用@Import注解
@Import({Person.class})
public class Configurate {

}

public class App 
{
    public static void main( String[] args )
    {
        ApplicationContext ctx  = new AnnotationConfigApplicationContext(Configurate.class);
        String[] beanDefinitionNames = ctx.getBeanDefinitionNames();
        Person person = ctx.getBean(Person.class);
        System.out.println(person);
        for (String definitionName : beanDefinitionNames) {
            System.out.println(definitionName); //com.yang.spring.domain.Person
        }

    }
}
@Import注解 和@Bean注解区别:@bean注入spring容器的对象,其beanName是方法名,而@Import注解注入的对象的beanName是类的全限定类名

 

4.@Import的另外一种方式
public class MyImport implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
        String[] kk = new String[1];
        kk[0]="com.yang.spring.domain.Person";
        return kk;
    }
}
@Import(MyImport.class)
public class Configurate {


}

public class App 
{
    public static void main( String[] args )
    {
        ApplicationContext ctx  = new AnnotationConfigApplicationContext(Configurate.class);
        String[] definitionNames = ctx.getBeanDefinitionNames();
        for (String definitionName : definitionNames) {
            System.out.println(definitionName);
        }


    }
}
5.@ComponentScan注解和@componet,@Service,@Controller ,@Reposity的组合使用

@ComponentScan("com.yang.spring")
public class Configurate {


}

@Component
public class Person {
    private String name;
    private int age;
}

public class App 
{
    public static void main( String[] args )
    {
        ApplicationContext ctx  = new AnnotationConfigApplicationContext(Configurate.class);
        String[] definitionNames = ctx.getBeanDefinitionNames();
        for (String definitionName : definitionNames) {
            System.out.println(definitionName);
        }


    }
}

 

6.实现ImportBeanDefinitionRegistrar,需求:当容器中有person这个bean时才注册Pig这个bean

public class Person {
    private String name;
    private int age;
}

public class Pig {
    public Pig() {
    }
}

public class MyImportBeanDefinitionRegister implements ImportBeanDefinitionRegistrar {

    @Override
    public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) {
        if(beanDefinitionRegistry.containsBeanDefinition("person")){
            RootBeanDefinition bd = new RootBeanDefinition(Pig.class);
            beanDefinitionRegistry.registerBeanDefinition("cutePig",bd);
        }

    }
}

@Import({MyImportBeanDefinitionRegister.class})
public class Configurate {
    @Bean
    public Person person(){
        return new Person("yangxiaohui",22);
    }

}

public class App 
{
    public static void main( String[] args )
    {
        ApplicationContext ctx  = new AnnotationConfigApplicationContext(Configurate.class);
        String[] definitionNames = ctx.getBeanDefinitionNames();
        for (String definitionName : definitionNames) {
            System.out.println(definitionName);
        }


    }
}

  

7.通过实现FactoryBean接口
public class Pig {
    public Pig() {
    }
}
public class MyFactoryBean implements FactoryBean<Pig> {
    @Override
    public Pig getObject() throws Exception {
        return new Pig();
    }

    @Override
    public Class<?> getObjectType() {
        return Pig.class;
    }

    @Override
    public boolean isSingleton() {
        return true;
    }
}
@Import({MyFactoryBean.class})
public class Configurate {
    @Bean
    public Person person(){
        return new Person("yangxiaohui",22);
    }

}
public class App 
{
    public static void main( String[] args )
    {
        ApplicationContext ctx  = new AnnotationConfigApplicationContext(Configurate.class);
        Object bean = ctx.getBean("com.yang.spring.domain.MyFactoryBean");
        System.out.println(bean.getClass());//class com.yang.spring.domain.Pig

    }
}

 

//8.手工注册
public class Cat {
    public Cat() {
        System.out.println("猫被初始化");
    }
}
public class Demo {
    public static void main(String[] args) {

        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
        ctx.register(Appconfig.class);
        ctx.refresh();
        RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(Cat.class);
        ctx.registerBeanDefinition("cat",rootBeanDefinition);
        System.out.println(ctx.getBean("cat").getClass());


    }
}

 

@bean注解一般用于第三方类,如redis的key和value对应的序列化器的 @ComponentScan用于自身开发的类 @Import方式比较少用

 

@Condional注解的用法,如果需要根据不同系统,注入不同的bean

public class LinuxCondition implements Condition {
    @Override
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
        Environment environment = conditionContext.getEnvironment();
        String osVersion = environment.getProperty("os.name");
        if(osVersion.contains("linux")){
            return true;
        }
        return false;
    }
}

public class WindowsCondition implements Condition{

    @Override
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
        Environment environment = conditionContext.getEnvironment();
        String osVersion = environment.getProperty("os.name");
        if(osVersion.contains("Windows")){
            return true;
        }



        return false;
    }
}

public class Configurate {
    @Bean
    @Conditional(LinuxCondition.class)
    public Person chinese(){
      return   new Person("xiaoMing",22);
    }

    @Bean
    @Conditional(WindowsCondition.class)
    public Person english(){
      return   new Person("peter",18);
    }

}

public class App 
{
    public static void main( String[] args )
    {
        ApplicationContext ctx  = new AnnotationConfigApplicationContext(Configurate.class);
        String[] definitionNames = ctx.getBeanDefinitionNames();
        for (String definitionName : definitionNames) {
            System.out.println(definitionName);
        }


    }
}

  

 



  

 

 

 

 

posted @ 2019-11-27 12:11  yangxiaohui227  阅读(328)  评论(0)    收藏  举报