核心容器的功能,Spring 的底层重要的特性就是Ioc(控制反转)和DI(依赖注入),spring认为所有的组件应该放到容器(Ioc)中,组件之间的关系通过容器(IOc)来自动装配,这就是所谓的依赖注入。接下来用注解的方式来完成组件的注册,注入功能。
1,案例
1.1 创建一个maven的项目
1.2引入spring的依赖
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.4.RELEASE</version>
</dependency>
以前用xml方式开发的时候用的是创建一个xml文件,将所有的关系配置在这个文件里
1.3,创建一个bean以及该有的构造器,get,set,toString方法
1.4,通过xml形式来注册
1.5,测试
注意;在通过组件id获取的时候id必须要与xml文件中的bean标签的id一致或者是java配置文件中的bean注解的方法名一致
2.0,注解的方式代替xml文件配置
在我们做的项目用到的springboot已经是注解的方式去注册bean组件,配置文件,带来非常的便捷。
2.1,@Configuration注解来配置文件
2.1,AnnotationConfigApplicationContext来创建容器
2.2,更改bean的名称
2.2,指定bean的方法名不改
@Bean注解放到方法上面,Ioc容器启动的时候会调用这个方法将返回值放到容器中,方法名作为组件的id。
3.0, 包扫描
3.1,xml方式扫描包
3.2,注解@ComponentScan(value = “”)包扫描
3.3,按照mvc的分层结构 创建controller,service,dao
- controller
- service
- dao
3.1,junit来测试
3.2,自动扫描排除指定规则
@ComponentScan
排除规则
-
FilterType.ANNOTATION ;按注解
-
FilterType.ASSIGNABLE_TYPE;按类型
-
FilterType.ASPECTJ;按类型模式表达式
-
FilterType.REGEX;按正则表达式
-
FilterType.CUSTOM;按自定义
3.2.1 排除组件 excludFilters
3.2.2 包含组件 incloudFilters
xml方式配置包含组件的时候是有默认的过滤规则
<!--use-default-filters="false"> 禁用默认过滤规则true 当false时只包含组件才能生效-->
<context:component-scan base-package="com.asyt.annotation" use-default-filters="false"></context:component-scan>
注解启用禁用过滤器规则
3.3,组件作用域
注解@Scope来控制作用范围
- SCOPE_PROTOTYPE;prototpe 多实例
- SCOPE_SINGLETON;singleton 单实例(默认的)
- org.springframework.web.context.WebApplicationContext#SCOPE_REQUEST;request 同一次请求创建一个实例
- org.springframework.web.context.WebApplicationContext#SCOPE_SESSION session 同一个session创建一个实例
单实例;Ioc容器启动就会去调用方法创建对象,将对象放到ioc容器中,以后每次获取从容器中拿。
多实例;ioc容器启动并不会去调用方法创建对象放在容器中,每次获取的时候才会调用方法创建对象
获取的时候;
3.3.1,懒加载(延迟加载)
懒加载只针对单实例bean 默认在容器启动的时候创建对象
懒加载容器启动并不会创建对象,第一次获取bean创建对象,并初始化。
使用懒加载注解@Lazy
第一次获取bean时会创建对象,之后每次获取bean都会从容器中拿而不会再创建对象去拿
4.0,按照条件注册bean
@Conditional;按照一定的条件进行判断,满足条件给容器中注册bean
通过环境操作系统来测试
5.0,导入组件
给容器中注册组件;
- 包扫描+组件标注注解(@Controller @Service @Respoitory @Component)
- @Bean【 导入第三方包里面的组件】
- @Import【快速给容器中导入一个组件】
首先创建一个新的类
public class color{
}
然后在配置文件中@Import注解来注册第三方的组件
6.0,bean的生命周期
创建对象-初始化-销毁
- 首先创建一个类Car
public class Car{
public Car(){
System.out.println("car.....自定义.....");
}
public void init(){
System.out.println("car...初始化.....");
}
public void destory(){
System.out.println("car.....销毁.....");
}
}
- 创建一个生命周期的配置文件 MarinConfigLifeCyle
package com.asyt.annotation.config;
import com.asyt.annotation.bean.Car;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* bean的生命周期
* bean创建--初始化--销毁
* 容器管理bean的生命周期
* 我们可以自定义初始化和销毁;容器在bean进行当前生命周期的时候来调用 我么定义的初始化和销毁
*
*/
@Configuration
public class MainConfigLifcycle {
@Bean
public Car car(){
return new Car();
}
}
- 查看Car是否注册到Ioc容器中
@Test
public void test01(){
//创建容器
AnnotationConfigApplicationContext annotationConfigApplicationContext =
new AnnotationConfigApplicationContext(MainConfigLifcycle.class);
System.out.println("容器创建完成。。。 ");
Car bean = annotationConfigApplicationContext.getBean(Car.class);
}
- 日志
/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/bin/java -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=59264:/Applications/IntelliJ IDEA.app/Contents/bin" -Dfile.encoding=UTF-8 -classpath "/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar:/Applications/IntelliJ IDEA.app/Contents/plugins/junit/lib/junit5-rt.jar:/Applications/IntelliJ IDEA.app/Contents/plugins/junit/lib/junit-rt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/charsets.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/deploy.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/ext/cldrdata.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/ext/dnsns.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/ext/jaccess.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/ext/jfxrt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/ext/localedata.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/ext/nashorn.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/ext/sunec.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/ext/sunjce_provider.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/ext/sunpkcs11.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/ext/zipfs.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/javaws.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/jce.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/jfr.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/jfxswt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/jsse.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/management-agent.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/plugin.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/resources.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/rt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/lib/ant-javafx.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/lib/dt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/lib/javafx-mx.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/lib/jconsole.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/lib/packager.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/lib/sa-jdi.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/lib/tools.jar:/Users/chenasiyatu/spring/target/test-classes:/Users/chenasiyatu/spring/target/classes:/Users/chenasiyatu/.m2/repository/org/springframework/spring-context/5.2.4.RELEASE/spring-context-5.2.4.RELEASE.jar:/Users/chenasiyatu/.m2/repository/org/springframework/spring-aop/5.2.4.RELEASE/spring-aop-5.2.4.RELEASE.jar:/Users/chenasiyatu/.m2/repository/org/springframework/spring-beans/5.2.4.RELEASE/spring-beans-5.2.4.RELEASE.jar:/Users/chenasiyatu/.m2/repository/org/springframework/spring-core/5.2.4.RELEASE/spring-core-5.2.4.RELEASE.jar:/Users/chenasiyatu/.m2/repository/org/springframework/spring-jcl/5.2.4.RELEASE/spring-jcl-5.2.4.RELEASE.jar:/Users/chenasiyatu/.m2/repository/org/springframework/spring-expression/5.2.4.RELEASE/spring-expression-5.2.4.RELEASE.jar:/Users/chenasiyatu/.m2/repository/junit/junit/4.12/junit-4.12.jar:/Users/chenasiyatu/.m2/repository/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar:/Users/chenasiyatu/.m2/repository/org/junit/jupiter/junit-jupiter/5.6.0/junit-jupiter-5.6.0.jar:/Users/chenasiyatu/.m2/repository/org/junit/jupiter/junit-jupiter-api/5.6.0/junit-jupiter-api-5.6.0.jar:/Users/chenasiyatu/.m2/repository/org/apiguardian/apiguardian-api/1.1.0/apiguardian-api-1.1.0.jar:/Users/chenasiyatu/.m2/repository/org/opentest4j/opentest4j/1.2.0/opentest4j-1.2.0.jar:/Users/chenasiyatu/.m2/repository/org/junit/platform/junit-platform-commons/1.6.0/junit-platform-commons-1.6.0.jar:/Users/chenasiyatu/.m2/repository/org/junit/jupiter/junit-jupiter-params/5.6.0/junit-jupiter-params-5.6.0.jar:/Users/chenasiyatu/.m2/repository/org/junit/jupiter/junit-jupiter-engine/5.6.0/junit-jupiter-engine-5.6.0.jar:/Users/chenasiyatu/.m2/repository/org/junit/platform/junit-platform-engine/1.6.0/junit-platform-engine-1.6.0.jar:/Users/chenasiyatu/.m2/repository/org/junit/platform/junit-platform-launcher/1.6.0/junit-platform-launcher-1.6.0.jar:/Users/chenasiyatu/.m2/repository/org/junit/vintage/junit-vintage-engine/5.6.0/junit-vintage-engine-5.6.0.jar:/Users/chenasiyatu/.m2/repository/junit/junit/4.13/junit-4.13.jar" com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit5 com.asyt.annoation.test.IOCTest_cylife,test01
car.....自定义.....
容器创建完成。。。
Process finished with exit code 0
自定义;
- 单例;在容器启动的时候创建对象
- 多例;在每次获取的时候创建对象
初始化; - 对象创建完成,并赋值好,调用初始化方法
销毁;- 单实例;容器关闭的时候
- 多实例;容易不会管理这个bean;容器不会调用销毁方法 手动调销毁方法
指定初始化和销毁
@Bean(initMethod = "init",destroyMethod = "destory")
销毁;