自动装配:
1.@Autowired ==>spring定义
(1)默认优先按照类型去容器中找到对象的组件,找到之后直接注入到容器中
(2)如果找到多个相同类型的组件,再按照属性的名称作为组件的id去容器中查找
@Qualifier("bookDao2") +@Autowired :
也可以使用这对注解,不过@Qualifier须指定具体要装配的组件的id而不能是属性名;
自动装配默认是一定要将属性赋值好,否则就会报错;
但是也可以通过使用@Autowired(required=false) :找到组件就注入,找不到就不注入也不会报错;
@Primary:让那个Spring进行自动装配的时候,默认使用首选的bean,一般是用在组件上。
- @Resource ==>java规范
可以和@Autowired一样实现自动装配的功能,默认是按照组件名称进行装配的;没有能支持@Parimary功能没有支持@Autowired(reqiured=true) - @Inject ==>java规范
需要导入java.inject的包,和Autowired的功能一样;没有required=false的功能
@Autowired:构造器,参数,方法,属性,都是从容器中获取参数组件的值
(1)标注在方法位置上:@Bean+方法参数,参数从容器中获取,默认不写@Autowire
(2)标注在构造器上:如果组件只有一个参数构造器,这个有参构造器的@Autowired可以省略
(3)放在参数位置 - profile :指定组件在哪个环境中才能被注册到容器中;不指定的话则任何环境下都能注册组件
- Spring 为我们提供的可以根据当前环境,动态的激活和切换一系列组件的功能;
- (1)加了环境标示注解@Profile的bean,只有这个环境被激活时才能注册到容器中;默认是default环境
- (2)写在配置类上,只有是指定的环境的时候,整个配置类里面的所有配置才能开始生效
- (3)没有标注环境的bean,任何环境下都是加载的
- *指定运行时的环境:
- 1.使用命令行参数的方式:在虚拟机的位置加载-Dspring.profile.active=test
- 2.使用代码的方法指定运行环境
1.@Autowired
@Repository
public class Dao {
}
=========================================================
@org.springframework.stereotype.Service
public class Service {
private Dao dao;
//有参构造方法
// @Autowired
public Service(@Autowired Dao dao) {
this.dao = dao;
}
public Dao getDao() {
return dao;
}
//@Autowired
public void setDao(Dao dao) {
this.dao = dao;
}
}//类的大括号
=========================================================
@org.springframework.stereotype.Service
public class Service {
private Dao dao;
//有参构造方法
// @Autowired
public Service(@Autowired Dao dao) {
this.dao = dao;
}
public Dao getDao() {
return dao;
}
//@Autowired
public void setDao(Dao dao) {
this.dao = dao;
}
}//类的大括号
=========================================================
@Configuration//表明是一个配置类
@ComponentScan({"com.tina.spring0123.autowired"})
public class config {
}
=========================================================
@SpringBootTest
public class IocTestAutowire {
@Test
public void test2(){
//读取配置类获取容器
AnnotationConfigApplicationContext ioc = new AnnotationConfigApplicationContext(config.class);
Service service = (Service)ioc.getBean("service");
System.out.println("service的值为:"+service);
Dao dao = (Dao)ioc.getBean("dao");
System.out.println("dao的值为:"+dao);
}
}
4. profile :
db.properties:
db.user= root
db.password= 123456
#db.url= jdbc:mysql://152.136.27.48:3306/d_tina?characterEncoding=utf8&characterSetResults=utf8&autoReconnect=true&failOverReadOnly=false
db.driverClass=com.mysql.jdbc.Driver
=========================================================
**
* @program: spring-0123
* @description
* profile :指定组件在哪个环境中才能被注册到容器中;不指定的话则任何环境下都能注册组件
* Spring 为我们提供的可以根据当前环境,动态的激活和切换一系列组件的功能;
* (1)加了环境标示注解@Profile的bean,只有这个环境被激活时才能注册到容器中;默认是default环境
* (2)写在配置类上,只有是指定的环境的时候,整个配置类里面的所有配置才能开始生效
* (3)没有标注环境的bean,任何环境下都是加载的
* @author: tina.liu
* @create: 2020-01-25 16:49
**/
@Profile(value = "test")
@Configuration //表明是一个配置类
@PropertySource(value = {"classpath:db.properties"}) //指定读取外部的配置文件中的值保存在IOC容器中
public class ProfileConfig implements EmbeddedValueResolverAware {
@Value("${db.user}")
private String user;
private StringValueResolver valueResolver;
private String driverClass =null;
@Override
public void setEmbeddedValueResolver(StringValueResolver stringValueResolver) {
this.valueResolver=stringValueResolver;
driverClass = valueResolver.resolveStringValue("${db.driverClass}");
}
@Bean
// @Profile(value = "test") //添加环境标识
//@Profile(value = "default") //添加环境标识
public Red red(){
return new Red();
}
//配置数据源test
//@Profile(value = "default")
@Profile(value = "test") //添加环境标识
@Bean(value = "testDatasource")
public DataSource testDatasource(@Value("${db.password}") String password) throws PropertyVetoException {
ComboPooledDataSource dataSource= new ComboPooledDataSource();
dataSource.setUser(user);
dataSource.setPassword(password);
dataSource.setJdbcUrl("jdbc:mysql://152.136.27.48:3306/d_tina?characterEncoding=utf8&characterSetResults=utf8&autoReconnect=true&failOverReadOnly=false");
dataSource.setDriverClass(driverClass);
return dataSource;
}
//配置数据源dev
@Profile(value = "dev") //添加环境标识
@Bean(value = "devDatasource")
public DataSource devDatasource(@Value("${db.password}") String password) throws PropertyVetoException {
ComboPooledDataSource dataSource= new ComboPooledDataSource();
dataSource.setUser(user);
dataSource.setPassword(password);
dataSource.setJdbcUrl("jdbc:mysql://152.136.27.48:3306/d_yoyo?characterEncoding=utf8&characterSetResults=utf8&autoReconnect=true&failOverReadOnly=false");
return dataSource;
}
//配置数据源prod
@Profile(value = "prod") //添加环境标识
@Bean(value = "prodDatasource")
public DataSource prodDatasource(@Value("${db.password}") String password) throws PropertyVetoException {
ComboPooledDataSource dataSource= new ComboPooledDataSource();
dataSource.setUser(user);
dataSource.setPassword(password);
dataSource.setJdbcUrl("jdbc:mysql://152.136.27.48:3306/d_xiaokai?characterEncoding=utf8&characterSetResults=utf8&autoReconnect=true&failOverReadOnly=false");
dataSource.setDriverClass(driverClass);
return dataSource;
}
}
=========================================================
@SpringBootTest//是SpringBoot自1.4.0版本开始引入的一个用于测试的注解。
public class IocTestProfile {
**
* *指定运行时的环境:
* * 1.使用命令行参数的方式:在虚拟机的位置加载-Dspring.profile.active=test
* * 2.使用代码的方法指定运行环境
* *
*/
@Test
public void test2(){
//读取配置类获取容器
AnnotationConfigApplicationContext ioc = new AnnotationConfigApplicationContext();
//设置需要激活的环境
//ioc.getEnvironment().setActiveProfiles("test","dev");
ioc.getEnvironment().setActiveProfiles("dev");
//注册主配置类
ioc.register(ProfileConfig.class);
//刷新容器
ioc.refresh();
//获取容器中的所有组件 并打印出来
String[] names = ioc.getBeanDefinitionNames();
for (String name:names) {
System.out.println("容器中的组件为");
System.out.println(name);
}
}
@Test
public void test(){
//读取配置类获取容器
ApplicationContext ioc = new AnnotationConfigApplicationContext(ProfileConfig.class);
//获取容器中的所有组件 并打印出来
String[] names = ioc.getBeanDefinitionNames();
for (String name:names) {
System.out.println("容器中的组件为");
System.out.println(name);
}
}
}//类的大括号
网友评论