容器概述
ApplicationContext是Spring loC容器实现的代表,它负责实例化,配置和组装Bean。
容器通过读取配置元数据获取有关实例化、配置和组装哪些对象的说明。
配置元数据可以使用XML、Java注解或Java代码来呈现。
它允许你处理应用程序的对象与其他对象之间的互相依赖关系。 配置元数据的方式
-
使用xml的配置 简单、直观适合入门
-
基于注解的配置: Spring 2.5支持基于注解的元数据配置. SSM框架开发中的使用
-
基于Java的配置: 从 Spring 3.0开始,由Spring JavaConfig项目提供的功能已经成为Spring核心框架的一部分。因此,你可以使用Java配置来代替XML配置
-
定义外部bean . 从spring4.0开始支持springboot1.0之后springboot完全采用javaConfig的方式进行开发
容器的实例化 对象在Spring容器创建完成的时候就已经创建完成,不是需要用的时候才创建
ioc的优点
1.解耦
2.集中管理
3.功能可复用(减少对象的创建和内存消耗)
4.使得程序的整个体系结构可维护性、灵活性、扩展性变高
// ClassPathXmlApplicationContext 根据项目路径的xml配置来实例化spring容器
// FileSystemXm1ApplicationContext根据磁盘路径的xml配置来实例化spring容器
// AnnotationConfigApplicationContext根据javaconfig来配置实例化spring容器
依赖注入
基于setter方法的依赖注入
1.属性必须声明了set方法 2. name是根据set方法的名字来的比如方法名字是: setIdxx ->name="idxx" <bean class="cn.tulingxueyuan.beans.User" id="user2"> <property name="idtuling" value="1"></property> <property name="username" value="zhangsan" ></property> <property name= "realname" value="张三"></ property> </ bean>
基于构造函数的依赖注入
1.将会调用自定义构造函数来实例化对象,就不会调用默认的无参构造函数 2, name是根据构造函数的参数名来的,比如:User(String idxx) -> name="idxx"3. name属性可以省略但是要注意参数的位置 4.如果非要把位置错开可以使用name或者index或者type5. index是下标―从开始 6. type在位置错开情况下只能在类型不一样的时候指定才有明显效果 <bean class="cn.tulingxueyuan. beans. User" id="user3"> <constructor-arg name="username" value="lisi"></constructor-arg> <constructor-arg name= "id_xushu" value="1 "></constructor-arg> <constructor-arg name="reainame"value="李四"></constructor-arg> </bean>
在容器实例化的时候就会加载所有的bean
控制加载顺序使用depends-on方法
懒加载bean 使用lazy-init设置
<! -- 默认为false:在spring容器创建的时候加载(实例化) true:在使用的时候(getBean)才会去加载(实例化)--> <bean class="cn.tulingxueyuan.beans.Person" id="person2" lazy-init="true"> <property name="id" value="1"></property> <property name="realName" value="吴彦祖"></ property><property name="name " value="徐庶"></ property> </ bean>
自动注入
byType根据类型去自动匹配当出现多个类型或者匹配到类型则会报错 byName根据set方法的名字去自动匹配 constructor根据构造器去匹配:优先会根据参数名字去匹配,假如参数名字没有匹配到,会根据参数类型去匹配,会根据构造函数的参数进行完整的匹配注入:如果构造函数的参数Person(Wife wife3,User user) ioc容器里面必须要有同时有wife和userl,名字没有匹配到会根据类型匹配,类型假如出现多个会注入失败但是不会报错
注解的方式来注册bean
将一个类注入到ioc中的三种方式
-
xml:<bean>
-
@Component (@Controller,@Service,@Repository)
-
@Bean @Import
Bean作用域分为 Singleton(单例)的作用域 和 Prototype(原型)的作用域
<!--作用域scope singleton 默认:单例只会在Ioc容器种创建一次 prototype多例(原型bean)每次获取都会new一次新的bean--> <bean class="cn.tulingxueyuan.beans.Person" id="person3" scope="prototype "> <property name="id" value="1"></property> <property name="realName " value="吴彦祖"></property> <property name="name" value="徐庶"></property> </ bean>
注解介绍
扫描包
-
base-package 设置需要扫描的包
-
排除扫描:<context:exclude-filter设置需要排除扫描的选项包含扫描<context : include-filter设置需要包含扫描的选项
type: 1.annotation默认根据注解的完整限定名设置排除\包括 2.assignable根据类的完整限定名设置排除\包括 3.aspectj org.example.. Service+根据切面表达式设置排除\包括,一般不会使用
4.regex org . example . Default.*―根据正则表达式设置包括\排除,一般不会使用 5.custom org.example.MyTypeFilter 根据接口org.springframework. core. type . TypeFilter设置排除\包括,
-
使用@Autowired来实现自动注入
bytype? byname? 默认优先根据类型去匹配 如果匹配到多个类型则会按照名字匹配·如果名又没有匹配到则会报错:
-
可以去修改属性的名字对应bean的名字:userServiceImpl
-
可以去修改Bean的名字对应属性的名字:@Service("userService")3.可以通过@Qualifier设置属性的别字
-
可以通过@Qualifier设置属性的名字(覆盖):@Qualifier("userServiceImpl")
-
可以通过@Primary设置其中一个Bean为主要的自动注入Bean: @Primary
-
使用泛型作为自动注入限定符
-
基于java的容器配置
核心注解 @Bean和@Configuration
对比xml