更多内容,前往IT-BLOG

一、核心容器


【1】@Configuration:告诉 Spring 这是一个配置类(配置类=配置文件)
【2】@Bean:给容器中注册一个 Bean ;类型为返回值类型,id 默认是用方法名作为 id 也可以通过 value 属性添加 id(相当于 xml 中的 <bean> 标签),主要用于导入第三方包里面的组件。
【3】@ComponentScan:包扫描,只要标注了 @Cotroller、@Service、@Repository、@Componet 等注解便会自动注入此类,excludeFilters 属性可以定义需要排除的注解或者类,通过 @Filter 数组进行定义,type 属性为类型(注解、类、正则、自定义的 TypeFilter 等等)class 为排除的类或注解类。includeFilters 属性指定只需要扫描包含的注解或者类,但需要关闭默认的扫描包注解的规则:useDefaultFilters=false默认为 true。主要用于导入自己定义的组件。

 1 @Configuration
2 @ComponentScan(value="com.atyintong"/*,excludeFilters= {
3 @Filter(type=FilterType.ANNOTATION,classes={Controller.class,Service.class})
4 },useDefaultFilters=false,includeFilters= {
5 @Filter(type=FilterType.ANNOTATION,classes=Service.class)
6 }*/)
7 public class MainConfig {
8 @Bean
9 public Person persion() {
10 return new Person("zzx",12);
11 }
12 }

【4】获取配置文件的方式:new AnnotationConfigApplicationContext(MainConfig.class)

1 AnnotationConfigApplicationContext application=new AnnotationConfigApplicationContext(MainConfig.class);
2 @Test
3 public void test() {
4 Person person = application.getBean(Person.class);
5 System.out.println(person);
6 }
7 /*输入内容如下:Person [name=zzx, age=12, nickName=null]*/

【5】@scope默认为 singleton 表示单实例,容器启动时调用方法创建对象放到 ioc 容器中,以后每次调用时直接从中获取。常用的还有 prototype 表示多实例,容器启动时不创建对象,每当调用时才创建当前对象。

1 @Scope(value="prototype")
2 @Bean
3 public Person persion() {

【6】@lazy:懒加载,单实例 bean 默认在容器启动时不创建对象,第一次获取对象的时候创建对象。以后调用不再创建对象。
【7】@Conditonal({Condition}):按照一定条件进行判断,放在配置类的方法上表示,满足条件才给容器注册 bean。也可以放在类上表示,满足条件才执行配置类。首先需要自定义一个实现 Condition 接口的类,如下:

 1 public class TestCondition implements Condition{
2
3 @Override
4 public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
5 // 1、context:判断条件能使用的上下文环境
6 // 2、metadata:注释信息
7 // 1.1 获取当前环境信息
8 Environment environment = context.getEnvironment();
9 // 1.2 获取bean的注册类信息
10 BeanDefinitionRegistry registry = context.getRegistry();
11 String property = environment.getProperty("os.name");
12 if(property.contains("Windows") && !registry.containsBeanDefinition("person")) {
13 return true;
14 }
15 return false;
16 }
17
18 }

在配置内中加载两个不同的 Persion对象,并在 person01 对象加载方法前加入 @Conditional 注解,查看是否加载此对象。

 1 @Bean
2 public Person person() {
3 return new Person("zzx",12);
4 }
5
6 @Conditional(TestCondition.class)
7 @Bean("person01")
8 public Person person01() {
9 return new Person("lisi",13);
10 }
11 /* IOC 容器启动时,不包含person01 对象,因为Conditional 条件返回为 false */

【8】@Import:导入组件,id 默认是组件的全类名。

 1 @Import({Cat.class,MyImportSelector.class})  //输出的结果为:com.atyintong.bean.Cat
2 @Configuration
3 public class MainConfig {
也可以将需要导入的组件集合定义在一个继承了 ImportSelector 的类中,并将此类通过 @Import 注解导入到容器中,如下:
1 public class MyImportSelector implements ImportSelector{
2
3 @Override
4 public String[] selectImports(AnnotationMetadata importingClassMetadata) {
5 // 通过全类名,导入需要的组件
6 return new String[] {"com.atyintong.bean.Color"};
7 }
8 }

【9】@FactoryBean:使用 Spring 提供的 FactoryBean (工厂Bean)。默认获取到的是工厂 bean 调用 getObject() 创建的对象,而要获取工厂 Bean 本身需要给 id 前面加一个 & 标识。如下:

 1 /**
2 * @ClassName: CarFactoryBean
3 * @Description: 实现 FactoryBean 接口,并在泛型中传入需要实例化的类
4 * @author: zzx
5 * @date: 2019年1月13日 下午11:12:45
6 */
7 public class CarFactoryBean implements FactoryBean<Car> {
8
9 @Override
10 public Car getObject() throws Exception {
11 // 创建泛型中的对象,对象会添加到容器中
12 return new Car();
13 }
14
15 @Override
16 public Class<?> getObjectType() {
17 // 对象的类型
18 return Car.class;
19 }
20
21 @Override
22 public boolean isSingleton() {
23 // true 表示对象是单例,false 表示多实例
24 return true;
25 }
26
27 }

对上述理论的测试:

 1 @Test
2 public void testFactory() {
3 Object car0 = application.getBean("carFactoryBean");
4 Object car1 = application.getBean("carFactoryBean");
5 Object car2 = application.getBean("&carFactoryBean");
6 //输入为 true,因为是单实例
7 System.out.println(car0 == car1);
8 //输出:com.atyintong.bean.Car@3d299e3
9 System.out.println(car1);
10 //输出:com.atyintong.condition.CarFactoryBean@55a561cf
11 System.out.println(car2);
12 }

二、Bean 的声明周期


【1】bean 指定初始化和销毁方法:通过指定 initMethod 属性指定初始化方法,destroyMethod 属性指定销毁方法。其中 init 和 destroy 方法是 Car 对象中定义的方法。

1 @Bean(initMethod="init",destroyMethod="destory")
2 public Car car() {
3 return new Car();
4 }

【2】类通过实现 InitializingBean DisposableBean接口

 1 public class Cat implements InitializingBean,DisposableBean{
2
3 @Override
4 public void destroy() throws Exception {
5 // 定义销毁逻辑
6 }
7
8 @Override
9 public void afterPropertiesSet() throws Exception {
10 // 定义初始化逻辑
11 }
12 }

【3】@PostConstruct:对象创建并赋值之后调用,@PreDestory:容器移除对象之前。

 1 public class Color {
2 //对象创建并赋值之后调用
3 @PostConstruct
4 public void init() {
5
6 }
7 //容器移除对象之前
8 @PreDestroy
9 public void destory() {
10
11 }
12 }

【4】后置处理器:BeanPostProcessor 在类的 init 方法前执行 postProcessBeforeInitialization 方法中任务,在初始化 init 之后执行 postProcessAfterInitialization 方法。

 1 @Component
2 public class MyBeanPostProcess implements BeanPostProcessor{
3
4 @Override
5 public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
6 //bean 表示当前类的全类名,beanName 表示容器中的 id
7 /* 测试输入:构造函数。。。
8 com.atyintong.bean.Car@1b083826---->car
9 init 初始化方法,创建对象之前
10 com.atyintong.bean.Car@1b083826---->car */
11 System.out.println(bean+"---->"+beanName);
12 return bean;
13 }
14
15 @Override
16 public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
17 System.out.println(bean+"---->"+beanName);
18 return bean;
19 }
20
21 }

三、组件赋值


【1】@Value():进行属性赋值操作

1 public class Person {
2 //使用@Value赋值;
3 //1、基本数值
4 //2、可以写SpEL; #{}
5 //3、可以写${};取出配置文件【properties】中的值(在运行环境变量里面的值)
6
7 @Value("${person.name}")
8 private String name;

【2】@PropertySource()引入配置文件时使用,通过 ${key} 获取配置内容

@PropertySource(value= {"classpath:/Persion.properties"})
public class MainConfig {

【3】@Autowired():自动注入,默认优先按照类型去容器中找对应的组件:applicationContext.getBean(BookDao.class) ,如果找到多个相同类型的组件,再将属性的名称作为组件 id 去容器中查找。但可以使用 @Qualifier("xxx") 指定需要装配的组件的 id ,而不使用属性名。自动装备一定要将属性赋值号,如果没有在容器中找到此属性,就会报 notfoundxxx错误,或者指定自动加载的 required 属性为 false ,就不必须加载此类也不用报错。

@Service
public class BookService {
@Qualifier("bookDao1")
@Autowired(required=false)
private BookDao bookDao;

当容器中存在多个同类对象时,我可以某个上添加@primary注解,当自动注入时,就会优先注入。

@Primary
@Bean("person01")
public Person person01() {

【4】@Resource:与@Autowired 一样实现自动装配功能,默认是按照组件名称进行装配。不支持 @primary 注解和 required属性。

@Resource(name="bookDao")
private BookDao bookDao;

【5】@Inject:需要导入 javax.inject 包,和 @Autowired 功能一样,但其没有 required 属性。@Autowired:Spring 定义的,@Resource、@Inject 都是 java 规范。

@Inject
private BookDao bookDao;


 ----关注公众号,获取更多内容----

Spring 注解整理的更多相关文章

  1. Spring 注解 整理

    首先 在xml中配置 xmlns:context="http://www.springframework.org/schema/context" http://www.spring ...

  2. spring 以及 spring mvc 中常用注解整理

    spring 以及 spring mvc 中常用注解整理 @RequestMapping(映射路径) @Autowired(注入 bean 对象) 例如: @Autowired private Bas ...

  3. Spring SpringMVC SpringBoot SpringCloud 注解整理大全

    Spring SpringMVC SpringBoot SpringCloud 注解整理 才开的博客所以放了一篇以前整理的文档,如果有需要添加修改的地方欢迎指正,我会修改的φ(๑˃∀˂๑)♪ Spri ...

  4. Spring 注解总结

    声明:这是转载的.内容根据网上资料整理.相关链接:http://www.360doc.com/content/10/1118/16/2371584_70449913.shtmlhttp://www.i ...

  5. 【Spring注解驱动开发】你还不会使用@Resource和@Inject注解?那你就out了!!

    写在前面 我在 冰河技术 微信公众号中发表的<[Spring注解驱动开发]使用@Autowired@Qualifier@Primary三大注解自动装配组件,你会了吗?>一文中,介绍了如何使 ...

  6. 【Spring注解驱动开发】如何实现方法、构造器位置的自动装配?我这样回答让面试官很满意!

    在 冰河技术 微信公众号前面的文章中,我们介绍了如何使用注解来自动装配Spring组件.之前将的都是在来的字段上添加注解,那有没有什么方法可以实现方法.构造器位置的自动装配吗?今天我们就一起来探讨下如 ...

  7. 【Spring注解驱动开发】自定义组件如何注入Spring底层的组件?看了这篇我才真正理解了原理!!

    写在前面 最近,很多小伙伴出去面试都被问到了Spring问题,关于Spring,细节点很多,面试官也非常喜欢问一些很细节的技术点.所以,在 Spring 专题中,我们尽量把Spring的每个技术细节说 ...

  8. 【Spring注解驱动开发】二狗子让我给他讲讲@EnableAspectJAutoProxy注解

    写在前面 最近,二狗子入职了新公司,新入职的那几天确实有点飘.不过慢慢的,他发现他身边的人各个身怀绝技啊,有Spring源码的贡献者,有Dubbo源码的贡献者,有MyBatis源码的贡献者,还有研究A ...

  9. 【Spring注解驱动开发】AOP核心类解析,这是最全的一篇了!!

    写在前面 昨天二狗子让我给他讲@EnableAspectJAutoProxy注解,讲到AnnotationAwareAspectJAutoProxyCreator类的源码时,二狗子消化不了了.这不,今 ...

  10. spring注解源码分析--how does autowired works?

    1. 背景 注解可以减少代码的开发量,spring提供了丰富的注解功能.我们可能会被问到,spring的注解到底是什么触发的呢?今天以spring最常使用的一个注解autowired来跟踪代码,进行d ...

随机推荐

  1. 问题:PHP扩展功能,去掉分号';'没有用,是怎么回事?(已解决)

    1. 环境:win10的操作系统,IIS的服务器. 2. 问题描述:PHP要开启访问MYSQL的模块mysqli,我打开配置文件,去掉相关扩展模块前面的分号';',然后重启服务器,但是无效 ~~ 3. ...

  2. 【Linux】Ubuntu随笔

    Ubuntu声明环境变量时使用 export JAVA_HOME=/xx/xx/xx,当需要引用时要写成 $JAVA_HOME 所以配置环境变量并声明方法如下: vim ~/.bashrc expor ...

  3. nuxt.js的生命周期

    nuxt的生命周期分为客户端生命周期,服务端生命周期 1.服务端的生命周期 执行顺序为:nuxtServerlnit(store,context){},  类似于vue.js中的main.js.可以在 ...

  4. EBI数据库下载数据

    EBI网址链接: https://www.ebi.ac.uk 方法:直接从ncbi上面找到想要下载数据的SRR号然后去EBI里面直接搜索即可得到. 底部就是想要下载的fastq文件了: 然后右键复制链 ...

  5. SpingBoot面试大汇总

    1.什么是SpringBoot? 1)用来优化Spring应用的初始搭建以及开发过程,使用特定的方式来配置(properties和yml文件) 2)嵌入式的内置服务器tomcat无需部署war文件简化 ...

  6. puts()与scanf(“%s”)

    使用gets()即使字符串中含有空格,依然可以接收,而scanf()不会. Example: /* 输入一个字符串到字符数组s1中,将s1中的字符串复制到字符数组s2中并输出s2中的字符串. 不用st ...

  7. mysql知识点二

    1.mysql中的语言有哪些?分别代表什么意思1.DDL(Data Define Language) 数据定义语言2.DML(Data Manipulation Language) 数据操作语言3.D ...

  8. getopt函数使用说明

    一.查询linux命令手册: #include<unistd.h> #include<getopt.h> /*所在头文件 */ int getopt(intargc, char ...

  9. git merge的原理

    当我我们拉去代码合并到master的另一个分支上面去的时候 只是对比当前分支commit的修改与增加的代码,其他代码以master为主.

  10. loadrunner添加头部

    web_add_auto_header("token_id", "{token_id}"); 或 web_add_header("token_id&q ...