作用:声明当前类是一个配置类,代替之前的配置文件beans.xml
作用:给容器中添加一个组件
@Bean("zhangsan")
public Person person(){
return new Person("张三","四川成都",18);
}
向容器中添加一个id为zhangsan的组件,如果不指定组件名称时,组件的id为当前方法的方法名
作用:设置扫描那些包下的组件
@ComponentScan("com.elitetyc.anno.annotation")
当前设置为扫描com.elitetyc.anno.annotation包下的,只要带了@Controller,@Component,@Service,@Repository注解都会被加载到ioc容器中
同时还可以指定扫描的过滤规则,那些需要扫描进来,哪些不需要扫描进来
注意:自定义过滤规则时,重写match方法,match方法返回true表示需要添加该类进容器,返回false则不添加该组件进容器
作用:调整作用域
可以取的值,
singleton:(默认值)单例,ioc容器创建时直接创建一个实例对象放入ioc容器中,使用时直接从ioc容器中取出实例进行使用
prototype:ioc容器创建时不会创建,使用时调用实例化方法创建实例,每一次使用都会调用一次实例化方法
request:
session:
作用:懒加载,标注了这个注解的组件,在ioc容器创建的时候并不会直接创建实例,而是要等到第一次使用的时候再去创建,然后加入到容器中
作用:满足何种条件的时候才将bean注入
1.新建类实现Condition接口,重写matches方法,方法返回true就要注入该bean,返回false就不注入该bean
//判断是否为linux系统
public class LinuxCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
Environment environment = context.getEnvironment();
if (environment.getProperty("os.name").contains("Linux")||environment.getProperty("os.name").contains("Mac")) {
return true;
}
return false;
}
}
2.在某个注入bean上面添加@Conditional注解,内部是一个Condition类的实现类的数组
@Conditional({LinuxCondition.class})
@Bean("linux")
public Person linux(){
return new Person("linux","",18);
}
3.运行以上代码,当系统为linux和mac os的时候才会将linux 这个person注入进ioc容器
4.注意:标注在方法上,是当前方法一下的内容,如果标注在类上,要是满足条件,该类中的所有bean才会被注入
作用:向容器中快速导入一个组件(自己写的类可以使用@Component等等,第三方库可以使用@Bean方式或者@Import快速导入)
@Import(Color.class)或者@Import({Color.class,Color1.class})
作用:给属性注入值
有三种方式:1.直接写值 2.写SpEL表达式 3.注入配置文件中的值
// 直接写入值
@Value("张三")
private String name;
// 使用SpEL表达式
@Value("#{30-2}")
private int age;
// 取出配置文件中的值
@Value("${person2.addr}")
private String addr;
然后再添加这个bean的类配置@PropertySource注解指定配置文件的位置
//指定person2中addr所在的配置文件位置
@PropertySource(value = "classpath:application.properties",ignoreResourceNotFound = true,encoding = "UTF-8" )
public class MainConfig {
注意:添加ignoreResourceNotFound = true,encoding = "UTF-8"是为了防止读取配置文件中的中文出现乱码(完美解决)
作用:指定当前类下的配置信息是从哪些配置文件中读取出来的
例如我MainConfig配置类中有一个Person类使用了@Value注解注入了一个application.properties配置文件中的配置信息,那么就需要添加一下代码
//指定person2中addr所在的配置文件位置
@PropertySource(value = "classpath:application.properties",ignoreResourceNotFound = true,encoding = "UTF-8" )
public class MainConfig {
其中ignoreResourceNotFound = true,encoding = "UTF-8"是忽略配置文件找不到的错误和防止出现读取中文配置出现乱码的情况
作用:自动注入
1.首先按照类型进行查找,如果只能找不到,报错,如果找到一个,直接赋值,如果找到多个,进行第二步
2.如果找到多个同类型的实例,就赋值ID与当前需要注入的属性名一样的那个bean
3.或者直接使用@Qualifier明确指定需要自动注入哪个ID的bean
4.默认如果在ioc容器中默认找不到对应的实例注入,则会报错,但是可以使用required属性设置为false则表示非必须注入,如果找到对应的则注入,如果找不到就不注入
@Autowired(required = false)
@Autowired标注不同位置的不同效果
1.标注在方法上,会自动在ioc容器中找到参数所对应的bean,赋值给参数
2.spring启动时默认会调用无参构造器新建对象,然后进行赋值操作,如果只有一个有参构造器,同时加了Autowired注解(也可以省略),那么会调用有参构造器,并且从ioc容器中获取参数传递给有参构造函数
3.
作用:指定需要自动注入那个ID的bean实例
@Qualifier("bookService") 这就是指定需要注入的是ioc容器中ID值为bookService的bean实例
作用:标注当前bean是一个首选bean,当ioc容器中有多个该类型的bean,如果我们其他地方注入该类型属性的时候,会首先装配这个bean
例如:并且向ioc容器中注入了两个bean类型为BookDao,id分别为bookDao1和bookDao2
@Bean("bookDao1")
public BookDao bookDao1(){
return new BookDao();
}
@Primary
@Bean("bookDao2")
public BookDao bookDao2(){
return new BookDao();
}
然后我们使用Autowired自动注入一个BookDao,由于我们bookDao有两个实例,并且bookDao2加了@Primary为首先bean,所以当前注入的为bookDao2这个实例
@Autowired
private BookDao bookDao;
- @Resource(jsr250)和@Inject(jsr330)
@Resource注解:默认是按照组件属性名称去注入的,但是也可以设置name属性,设置指定注入那个id值的bean
@Resource(name = "bookDao2") //指定注入id为bookDao2的bean如果不指定name则注入id为bookDao的bean
private BookDao bookDao;
注意:Resource注解不支持与Autowired的Primary和Qualifier组合
@Inject注解:需要导入一个包javax.inject,效果和@Autowired一样
* profile:
* spring为我们提供的可以根据环境,动态激活和切换一些bean组件
* 开发环境,测试环境,生产环境
* 数据源:(/A)(/B)(/C)
@Profile注解:指定组件在哪个环境被激活的时候才会注册到ioc容器中,不指定时,默认都会被注册到ioc容器中
11111.先在配置类新加以下内容,并且配置Profile不同的环境
// 测试数据源
@Profile("test")
@Bean
public DataSource dataSourceTest() throws PropertyVetoException {
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setUser("root");
dataSource.setPassword("123456");
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/anno_test");
dataSource.setDriverClass("com.mysql.jdbc.Driver");
return dataSource;
}
// 开发数据源
@Profile("dev")
@Bean
public DataSource dataSourceDev() throws PropertyVetoException {
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setUser("root");
dataSource.setPassword("123456");
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/anno_dev");
dataSource.setDriverClass("com.mysql.jdbc.Driver");
return dataSource;
}
// 生成数据源
@Profile("prod")
@Bean
public DataSource dataSourceProd() throws PropertyVetoException {
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setUser("root");
dataSource.setPassword("123456");
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/anno_prod");
dataSource.setDriverClass("com.mysql.jdbc.Driver");
return dataSource;
}
22222.然后配置文件指定当前环境
spring.profile.active = test 或者
spring.profile.active = dev 或者
spring.profile.active = prod
注意:@Profile卸载配置类上时,只有当指定环境被激活时,当前配置类的所有配置才会生效
网友评论