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