Spring学习-04课SpringIoC的javaconfig使用

58 阅读2分钟

JavaConfig

1、可以使用JavaConfig配置来代替XML配置定义外部bean

2、springboot 完全采用javaConfig的方式进行开发

JavaConfig 原来是Spring的一个子项目,它通过Java类的方式提供Bean的定义信息,在Spring3的版本 ,JavaConfig已正式成为Spring4的核心功能。

@Bean @Configuration


JavaConfig的使用

1、在配置类上加上注解

@Configuration

用于标记一个Spring 配置类

之前根据XML问你件启动spring上下文 现在使用类

2、在配置类上添加扫描范围

@Configuration
@ComponentScan(basePackages = "com.kdy")

设置扫描范围

3、创建上下文

AnnotationConfigApplicationContext ioc=new AnnotationConfigApplicationContext(IocJavaConfig.class);

ioc.getBean(。。。。。);

使用第三方Bean,并赋值初始化

@Bean
public DruidDataSource dataSource(){
    DruidDataSource dataSource = new DruidDataSource();
    dataSource.setName("root");
    dataSource.setPassword("123456");
    dataSource.setUrl("jdbc:mysql://localhost:3306/test");
    dataSource.setDriverClassName("com.mysql.jdbc.Driver");
    return dataSource;
}

@Bean 可以在Configuation 或 @Component中使用

初始化及销毁Bean方法

@Bean(initMethod = "initRole",destroyMethod ="desRole")
public Role role(){
    System.out.println("使用的是此处的Bean");
    Role role = new Role();
    return role;
}

注:初始化及销毁方法 写在Role类中

重新设置Bean的名字

@Bean(name="newname")

@Bean(name={"newname1","newname2"})

@Bean 与 @Service @Controller 的区别是 将一个实例化好的类交给Spring管理,能够有效干预实例化过程。

设置单例多例

@Scope("prototype")

引入配置文件并注入Bean

@PropertySource("classpath:db.properties")
public class IocJavaConfig {
    @Value("${mysql.user}")
    private String name;
    @Value("${mysql.password}")
    private String password;
    @Value("${mysql.url}")
    private String url;
    @Value("${mysql.driver}")
    private String driverString;

    @Bean
    public DruidDataSource druidDataSource(){
        DruidDataSource dataSource = new DruidDataSource();

        dataSource.setName(name);
        dataSource.setPassword(password);
        dataSource.setUrl(url);
        dataSource.setDriverClassName(driverString);
        System.out.println(driverString);
        return dataSource;
    }

@PropertySource("classpath:db.properties") 引入外部资源文件

导入配置

@Import(SecondJavaConfig.class)

导入第二个配置类 或导入多个配置类

@Import({SecondJavaConfig.class,ThirdJavaConfig.class})

同时 @Import可以直接讲一个类注册为一个Bean

怎么自动依赖外部Bean

直接在方法里面写上需要依赖的参数即可 不需要写AutoWired

public DruidDataSource druidDataSource(Role role){
    //.........
}

怎么依赖内部Bean (写在同一个依赖文件里面的Bean)

直接调用方法即可

@Import 高级应用 以字符串的形式注册多个类

重点 1、创建一个类 实现 ImportSelector接口


public class MyImportSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {

        return new String[]{
                "com.kdy.beans.Person",
                "com.kdy.beans.Wife"
        };
    }
}

2、@Import(类.class)

会实现以字符串的形式注册多个Bean

3、使用的时候必须以 类名.class 获取

Wife bean = ioc.getBean(Wife.class);
System.out.println(bean);

概念态 定义态

@Import 导入实现的 ImportBeanDefinitionRegistrar 重写registerBeanDefinitions 来注册一个或多个Bean

@Configuration
public class MyImportBeanDefinitionRegstrar implements ImportBeanDefinitionRegistrar {
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        //ImportBeanDefinitionRegistrar.super.registerBeanDefinitions(importingClassMetadata, registry);
        GenericBeanDefinition genericBeanDefinition = new GenericBeanDefinition();
        genericBeanDefinition.setBeanClass(Person.class);
        registry.registerBeanDefinition("person",genericBeanDefinition);

    }
}