有不懂的可以参考之前的文章!

https://www.cnblogs.com/Mrchengs/p/10109053.html

1.Bean的生命周期

    创建---初始化---销毁
 
容器管理bean的生命周期:
我们可以自定义初始化和销毁的方法
 
构造器: 
    1.单实例:在容器创建好之后创建实例
    2.多实例:在每次获取的时候创建对象
 
初始化:
    对象创建好,并赋值好,进行初始化
销毁:
    单实例:容器关闭的时候
    多实例:容器不会管理这个bean,在容器关闭的时候不会调用销毁的方法
1.指定初始化和销毁的方法:通过@Bean的注解
    相当于:init-method,destroy-method
public class Chirld {

     public Chirld() {
           System.out.println("创建Child实例....");
     }
     public void init(){
           System.out.println("初始化方法.....");
     }
     public void destroy(){
           System.out.println("销毁方法....");
     }
}
@Configuration
public class TheLifeOfInitAnfDestroy {
     @Bean(initMethod="init",destroyMethod="destroy")
     public Chirld car(){
           return new Chirld();
     }
}
     @Test
     public void test4(){
           AnnotationConfigApplicationContext app = new  AnnotationConfigApplicationContext(TheLifeOfInitAnfDestroy.class);

           System.out.println("容器创建完成");
           //关闭
           app.close();
     }
创建Child实例....
初始化方法.....
容器创建完成
十一月 ,  :: 上午  org.springframework.context.annotation.AnnotationConfigApplicationContext doClose
信息: Closing  org.springframework.context.annotation.AnnotationConfigApplicationContext@512ddf17: startup date [Fri Nov  :: CST ];  root of context hierarchy
销毁方法....

在容器关闭的时候进行销毁

2.接口方法

通过Bean实现InitializingBean自定义初始化逻辑
                       DisposableBean自定义销毁容器
public interface InitializingBean {
     void afterPropertiesSet() throws Exception;
}
public interface DisposableBean {
     void destroy() throws Exception;
}
@Component
public class Chirld2 implements InitializingBean,DisposableBean  {

     public Chirld2() {
           System.out.println("创建Child2实例....");
     }
     public void afterPropertiesSet() throws Exception {
           System.out.println("init.....");

     }
     public void destroy() throws Exception {
           System.out.println("destroy....");
     }
}
@Configuration
@ComponentScan("coom.MrChengs.bean")
public class TheLifeOfInitAnfDestroy {

}
@Test
     public void test4(){
           AnnotationConfigApplicationContext app = new  AnnotationConfigApplicationContext(TheLifeOfInitAnfDestroy.class);

           System.out.println("容器创建完成");
           //关闭
           app.close();
     }
创建Child2实例....
init.....
容器创建完成
十一月 ,  :: 上午  org.springframework.context.annotation.AnnotationConfigApplicationContext doClose
信息: Closing  org.springframework.context.annotation.AnnotationConfigApplicationContext@512ddf17:   startup date [Fri Nov  :: CST ];  root of context hierarchy
destroy....
3.可以使用JSR250
    @PostConStruct:在bean创建完成并且属性赋值完成,来执行初始化
    @PreDestroy:在容器销毁bean之前通知我们进行清理

//代码.....

4.BeanPostProcessor接口:bean的后置处理器

在bean初始化之后进行一些处理工作
  postProcessBeforeInitialization:在初始化之前工作
 
  postProcessAfterInitialization:  在初始化之后工作
@Component
public class MyBeanPostProcessor implements BeanPostProcessor{
     //bean:刚刚创建的实例
     //beanName:bean的名字
     public Object postProcessBeforeInitialization(Object bean,  String beanName) throws BeansException {
           System.out.println("post init....."); 
           return bean;
     }
     public Object postProcessAfterInitialization(Object bean,  String beanName) throws BeansException {
           System.out.println("aftet init ....");
           return bean;
     }
}
@Configuration
@ComponentScan("coom.MrChengs.bean")
public class TheLifeOfInitAnfDestroy {
}
     @Test
     public void test4(){
           AnnotationConfigApplicationContext app = new  AnnotationConfigApplicationContext(TheLifeOfInitAnfDestroy.class);
           System.out.println("容器创建完成");
           //关闭
           app.close();
     }
post init.....
aftet init ....
post init.....
aftet init ....
post init.....
aftet init ....
创建Child2实例....
post init.....
init.....
aftet init ....
容器创建完成
十一月 ,  :: 上午  org.springframework.context.annotation.AnnotationConfigApplicationContext doClose
信息: Closing  org.springframework.context.annotation.AnnotationConfigApplicationContext@512ddf17: startup date [Fri Nov  :: CST ];  root of context hierarchy
destroy....
底层对BeanPostProcessor的使用:
bean赋值,注入其他组建,@Autowire,生命周期注解功能。。。。。

 2.属性赋值:

@Value("")
1.基本数值
2.可以写Spel : #{}
3.可以写 ${ } ,取出配置文件中的只

person.properties

person.school=MrChengs
public class Person {

     @Value("MrChengs")
     private String name;
     @Value("#{20-12}")
     private int age;
     @Value("${person.school}")
     private String school;
...
}
@Configuration//引入资源
@PropertySource(value={"classpath:/person.properties"})
public class ValueConfig {
     @Bean
     public Person person(){
           return new Person();
     }
}
@Test
     public void test5(){
           AnnotationConfigApplicationContext app = new  AnnotationConfigApplicationContext(ValueConfig.class);

           String [] names = app.getBeanDefinitionNames();
           for(String name : names){
                System.out.println(name);
           }
           Person person = app.getBean(Person.class);
           System.out.println(person);

     }
valueConfig
person
Person [name=MrChengs, age=8, school=MrChengs]
@PropertySource(value={"classpath:/person.properties"})用于加载配置文件
public @interface PropertySource {

     String name() default "";

     String[] value();

     boolean ignoreResourceNotFound() default false;

     String encoding() default "";

     Class<? extends PropertySourceFactory> factory() default  PropertySourceFactory.class;
}

自动装配:

利用依赖注入(DI)完成对IOC容器中各个组件的依赖关系。
前提自动注入的需要提前在容器中

@Autowired

1.默认优先按照类型进行容器组件中查找
2.当容器中有多个相同类型的组件,再将属性的名作为组件的id去容器中查找
applicationContext.getBean("customerDao")...

     @Autowired
     private CustomerDao customerDao;
默认按照方法名去id中查找
3.  @Qualifier
指定需要装配的组件id
 @Qualifier("customerDao")
     @Autowired
     private CustomerDao customerDao2;
4.默认一定将属性赋值好
5.如果没有的情况下组件默认是null
    不是必须的,此时容器中没有所需要装配的bean也不会报错
     @Qualifier("customerDao")
     @Autowired(required=false)
     private CustomerDao customerDao2;

6.@Primary:让spring进行装配的时候,默认使用首选的bean

     @Autowired(required=false)
     private CustomerDao customerDao;

     @Primary
     @Bean("customerDao2")
     public CustomerDao customer(){
    ...
}
@Repository
public class CustomerDao {
}
@Service
public class CustomerService {
     @Autowired
     private CustomerDao customerDao;

     public void print(){
           System.out.println("---->"+customerDao);
     }
}
@Configuration
@ComponentScan({"coom.MrChengs.config.service","coom.MrChengs.config.dao"})
public class AutowiredConfig {
     @Bean("customerDao2")
     public CustomerDao customer(){
           return new CustomerDao("customer2");
     }

}
     @Test
     public void test6(){
           AnnotationConfigApplicationContext app = new      AnnotationConfigApplicationContext(coom.MrChengs.config.AutowiredConfig.class);

           String [] names = app.getBeanDefinitionNames();
           for(String name : names){
                System.out.println(name);
           }
           CustomerService cus =  app.getBean(CustomerService.class);
           cus.print();
           //System.out.println(cus);
     }
autowiredConfig
customerService

此时容器中有两个相同类型的bean
customerDao
customerDao2

此时注入的类型是:
---->CustomerDao [name=null]
spring还支持@Resource和@Inject   java规范注解
@Resource
可以实现和@Autowire一样的功能 实现,默认是按照组件的名称进行装配
     @Resource
     private CustomerDao customerDao;

可以修改器默认装配的名称

     @Resource(name="customerDao2")
     private CustomerDao customerDao;

不可以支持@Primary功能和request=false的功能

@Inject
需要导入下面的依赖
<!-- https://mvnrepository.com/artifact/javax.inject/javax.inject -->
<dependency>
    <groupId>javax.inject</groupId>
    <artifactId>javax.inject</artifactId>
    <version>1</version>
</dependency>
     @Inject
     private CustomerDao customerDao;
其实先功能和@Autowire功能一样
其本身没有属性,没有require=false这个属性
支持@Primary

@Autowire

@Target({ElementType.CONSTRUCTOR, ElementType.METHOD,  ElementType.PARAMETER, ElementType.FIELD,  ElementType.ANNOTATION_TYPE})

@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {

可以标注的位置有构造器,方法,属性

方法上

@Component
public class Person {
...
}
@Component
public class Students {
...
     @Autowired
     public void setPerson(Person person) {
           this.person = person;
     }
..
}
     AnnotationConfigApplicationContext app = new  AnnotationConfigApplicationContext(coom.MrChengs.config.AutowiredConfig.class);

           Students s = app.getBean(Students.class);

           System.out.println(s);
           Person p = app.getBean(Person.class);
           System.out.println(p);
Students [person=Person [name=MrChengs, age=,  school=${person.school}], name=null]
Person [name=MrChengs, age=, school=${person.school}]
构造器:
     @Autowired
     public Students(Person person, String name) {
           super();
           this.person = person;
           this.name = name;
           System.out.println("Students.....");
     }
1.标注在方法位置上,@Bean+方法参数,参数从容器中获取
2.标注在构造器上:如果组件只有一个构造函数,可以省略
3.放在参数位置

3spring:生命周期,属性赋值,自动装配的更多相关文章

  1. Spring Bean 注入 1 - 构造方法注入,属性注入,自动装配

    1.代码结构图 xxx 2.bean代码 package com.xxx.bean; /** * Created with IntelliJ IDEA. * User: zhenwei.liu * D ...

  2. 从EFCore上下文的使用到深入剖析DI的生命周期最后实现自动属性注入

    故事背景 最近在把自己的一个老项目从Framework迁移到.Net Core 3.0,数据访问这块选择的是EFCore+Mysql.使用EF的话不可避免要和DbContext打交道,在Core中的常 ...

  3. Spring 框架基础(02):Bean的生命周期,作用域,装配总结

    本文源码:GitHub·点这里 || GitEE·点这里 一.装配方式 Bean的概念:Spring框架管理的应用程序中,由Spring容器负责创建,装配,设置属性,进而管理整个生命周期的对象,称为B ...

  4. Spring - bean的autowire属性(自动装配)

    当我们要往一个bean的某个属性里注入另外一个bean,我们会使用<property> + <ref/>标签的形式.但是对于大型项目,假设有一个bean A被多个bean引用注 ...

  5. spring4笔记----spring生命周期属性

    init-method : 指定bean的初始化方法-spring容器会在bean的依赖关系注入完成后调用该方法 destroy-method :指定bean销毁之前的方法-spring容器将会在销毁 ...

  6. [原创]java WEB学习笔记99:Spring学习---Spring Bean配置:自动装配,配置bean之间的关系(继承/依赖),bean的作用域(singleton,prototype,web环境作用域),使用外部属性文件

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  7. 第四章 Spring.Net 如何管理您的类___对象的自动装配

    由于这几天都比较忙,所以对笔记暂时没有更新. Spring.NET具有自动装配的能力,也就是说,Spring.NET可以通过对象的定义自动分辨某个对象的协作对象.自动装配是针对单个对象(按:针对每个协 ...

  8. Bean的自动装配及作用域

    1.XML配置里的Bean自动装配 Spring IOC 容器可以自动装配 Bean,需要做的仅仅是在 <bean> 的 autowire 属性里指定自动装配的模式.自动装配方式有: by ...

  9. 第4章-Vue.js 交互及实例的生命周期

    一.学习目标 了解实例生命周期的过程 理解钩子函数的作用 掌握Vue.js过滤器的使用方法 (重点) 能够使用网络请求进行前后端交互 (重点.难点) 二.交互的基本概念 2.1.前端和后端的概念 说明 ...

随机推荐

  1. Linux 14.04lts 环境下搭建交叉编译环境arm-linux-gcc-4.5.1

    交叉编译工具链是为了编译.链接.处理和调试跨平台体系结构的程序代码,在该环境下编译出嵌入式Linux系统所需要的操作系统.应用程序等,然后再上传到目标板上. 首 先要明确gcc 和arm-linux- ...

  2. USACO翻译:USACO 2012 JAN三题(2)

    USACO 2012 JAN(题目二) 一.题目概览 中文题目名称 叠干草 分干草 奶牛联盟 英文题目名称 stacking baleshare cowrun 可执行文件名 stacking bale ...

  3. R12.2 URL Validation failed. The error could have been caused through the use of the browser&#39;s navigation buttons

    EBS升级到R12.2.4后,进入系统操作老是报以下错误: 通过谷歌发现有人遇到相同的问题,并提供了解决方案. 原文地址:http://onlineappsdbaoracle.blogspot.com ...

  4. Linux目录介绍

    /: 根目录,一般根目录下只存放目录,不要存放文件,/etc./bin./dev./lib./sbin应该和根目录放置在一个分区中/bin:/usr/bin: 可执行二进制文件的目录,如常用的命令ls ...

  5. 怎么把QQ我的收藏表情图片转移到另一台电脑上

    把收藏的QQ表情从一台电脑转移到另一台电脑的操作步骤如下:    1.在有表情的电脑登陆QQ,随便打开一个聊天窗口,点击[表情],选择[表情设置],点击[导入导出表情包],选择[导出全部表情包]:   ...

  6. SQL Server 2005为数据库设置用户名和密码的方法

    1.打开SQL Server Manager管理器,在左面找到 ‘安全性’ 单击右键 选择‘新建”->“登录”, 如下图 2.弹出对话框,在登录名中输入你的登录号,选择'SQLSERVER身份验 ...

  7. Core Audio 在Vista/Win7上实现

    应用范围:Vista / win7, 不支持XP 1. 关于Windows Core Auido APIs 在Windowss Vista及Windows 7操作系统下,微软为应用程序提供了一套新的音 ...

  8. SIMD---SSE系列及效率对比

    SSE(即Streaming SIMD Extension),是对由MMX指令集引进的SIMD模型的扩展.我们知道MMX有两个明显的缺点: 只能操作整数. 不能与浮点数同时运行(MMX使用FPU寄存器 ...

  9. Android/IOS手机使用Fiddler抓包

    对于Android和IOS开发及测试的同事来说抓包是一个很重要的事,有利于排查问题所在,快速定位问题.但长期以来一直没有一款可以快速抓包的工具,直到有了Fiddler2. 使用步骤: 1.  Fidd ...

  10. python函数(二)

    python函数(二) 变量的作用域 1.局部变量与全局变量 在函数内创建的变量被称为局部变量,这类变量的生命周期与函数相同,当函数执行完毕时,变量也就随之消失. 此类变量只能在函数内部调用,函数外不 ...