dccmmtop / notebook

个人博客记录
0 stars 0 forks source link

Bean装配相关注解 #97

Open dccmmtop opened 1 year ago

dccmmtop commented 1 year ago

@ComponentScan

如何扫描指定的包

这种两种方式都是传入字符串,无法方便的重构。因为我们的编辑器一般不会解析你的字符串值,可以使用下面方式:

@ContextConfiguration(classes=xxx.class)

需要在 xxx.class 中加载配置

@Component

向容器中注册组件

@Autowired

@Bean

@Profile("dev")

@Conditional

@Primary

@Qualifier("xxx bean name")

@Scope bean 的作用域

默认所有的 bean 都是单例的。Spring 定义了多种作用域,包括:

示例

使用 @Scope 注解,改变bean的作用域

@RunWith(SpringJUnit4ClassRunner.class)
@ComponentScan
@ContextConfiguration(classes = ScopeDemo.class)
public class ScopeDemo {
    @Autowired
    @Qualifier("singleSTU")
    private Student s1;

    @Autowired
    @Qualifier("singleSTU")
    private Student s2;

    @Autowired
    @Qualifier("prototypeSTU")
    private Student s3;

    @Autowired
    @Qualifier("prototypeSTU")
    private Student s4;

    @Test
    public  void scopeDemo(){
        Assert.assertEquals("s1 s2 是单例作用域,两者应该相等:", s1.hashCode(), s2.hashCode());
        Assert.assertNotEquals("s3 s4 是原型作用域,两者应该不相等:", s3.hashCode(), s4.hashCode());
    }
}

@Configuration
class Student {

    private int age;

    /**
     * 默认是单例作用域
     * @return
     */
    @Bean("singleSTU")
    public Student stu(){
        Random random = new Random();
        Student s1 = new Student();
        s1.setAge(random.nextInt(100));
        return s1;
    }

    /**
     * 设置原型作用域
     * @return
     */
    @Bean("prototypeSTU")
    @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
    public Student stu1(){
        Random random = new Random();
        Student s1 = new Student();
        s1.setAge(random.nextInt(100));
        return s1;
    }

    public int getAge() {
        return age;
    }

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

运行时注入外部值

把配置文件中的字段注入到对象中

Enviroment

通过注解@PropertySource("xxx")讲配置文件中的信息注入到Enviorment 对象中:

@RunWith(SpringJUnit4ClassRunner.class)
@ComponentScan
@ContextConfiguration(classes = EnviromentDemo.class)
public class EnviromentDemo {

    @Autowired
    private Mysql mysql;

    @Test
    public void testDataSource(){
        System.out.println(mysql.getPort());
    }

}

@Configuration
@PropertySource("classpath:/app.properties")// 将配置文件中的字段加载到 Environment 中,稍后可以通过 Environment 对象获取
class DataSource {

    @Autowired
    Environment env;

    @Bean
    public Mysql mysql(){
        // 获取对应的字段值,getProperty 更多用法参考源码
        return  new Mysql(env.getProperty("mysql.port", Integer.class), env.getProperty("mysql.host"));

    }
}
 class Mysql {
     private int port;
     private String host;

     public Mysql(int port, String host) {
         this.port = port;
         this.host = host;
     }

     public int getPort() {
         return port;
     }

     public void setPort(int port) {
         this.port = port;
     }

     public String getHost() {
         return host;
     }

     public void setHost(String host) {
         this.host = host;
     }
 }

通过属性占位符装配

还可以通过 ${} 占位符读取配置文件中的字段,注入到字段中; 如下:

@RunWith(SpringJUnit4ClassRunner.class)
@ComponentScan
@ContextConfiguration(classes = ValueDemo.class)
public class ValueDemo {

    @Autowired
    private Mysql1 mysql;

    @Test
    public void testDataSource(){
        System.out.println(mysql.getPort());
    }

}

@Configuration
class DataSource1 {

    @Autowired
    Environment env;

    @Bean // 这个bean 是必须的。可以解析占位符,自动查找
    public  static PropertySourcesPlaceholderConfigurer  propertySourcesPlaceholderConfigurer(){
        return new PropertySourcesPlaceholderConfigurer();
    }

    @Bean
    // ${} 占位符方式注入
    public Mysql1 mysql(@Value("${mysql.port}") int port,@Value("${mysql.host}") String host){
        // 获取对应的字段值,getProperty 更多用法参考源码
        return  new Mysql1(port, host);

    }
}

class Mysql1 {
    private int port;
    private String host;

    public Mysql1(int port, String host) {
        this.port = port;
        this.host = host;
    }

    public int getPort() {
        return port;
    }

    public void setPort(int port) {
        this.port = port;
    }

    public String getHost() {
        return host;
    }

    public void setHost(String host) {
        this.host = host;
    }
}
rahulbansal3005 commented 1 year ago

i am interested to work on this issue