spring
maven仓库地址:https://mvnrepository.com/search?q=spring
bean装配方式的选择:优先自动装配、然后用基于javaConfig的装配、最后xml配置
1. ioc容器 基于xml装配
ioc:inversion of control,控制反转。将创建对象的工作交给框架完成。
基于xml配置文件:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="classA" class="com.xt.abc.impl.ClassA" ></bean> </beans>
1.1 ApplicationContext应用上下文
读取完配置文件(或注解),默认情况下就会通过反射创建对象,并组装对象
此接口的实现类:需要spring-context.jar
FileSystemXmlApplicationContext 从可访问的任意磁盘路径上加载配置文件
ClassPathXmlApplicationContext 从类的根路径上加载(基于XML配置)
WebXmlApplicationContext 在一个Web应用的范围内加载
AnnotationConfigApplicationContext 通过配置类加载bean
使用示例:
ApplicationContext context = new ClassPathXmlApplocationContext("xxx.xml"); ClassA classA = context.getbean(xxx.ClassA.class);
1.2 bean对象
配置中定义的,而由Spring IOC 容器实例化、组装、管理的对象
(1)属性:
id:唯一标识,用于获取对象
class:类全限定名,用于反射创建对象
scope:对象作用域
singleton:默认,单例
prototype:多例
request:WEB项目中,表明创建的此对象存入request域
session:WEB项目中,表明创建的此对象存入session域
global session:WEB项目中,集群环境下的一个session中
init-method:指定实例化bean时要调用的方法
destroy-method:指定从容器中移除销毁bean时要调用的方法
(2)作用域和生命周期
bean的scope属性指定:
singleton:单例,默认
prototype:多例,每次获取对象时,都创建返回一个新的对象
request:每次Http请求都会创建一个新的对象,此对象只在当前请求有效
session:同一个HTTP Session共享一个对象,不同的session获得的是不同的对象
global-session:集群环境下,一个session共享一个对象
生命周期:
单例:
对象创建:容器创建后,就创建对象(配置文件加载后就创建)
对象销毁:容器销毁时,销毁容器
多例:
对象创建:每次获取对象时才创建(每次getBean("xxx")时创建)
对象销毁:由java垃圾回收器回收
(3)容器创建bean对象的三种方式
①默认的,通过 class属性指定的类的无参构造创建
<bean id="xxx" class="com.xt.ClassA" />
如上,ClassA的实例化会通过其无参构造创建
②工厂创建
即spring容器实例化工厂,但另一个类对象通过工厂对象的某个方法创建
<bean id="instanceFactory" class="com.xt.factory.InstanceFactory" /> <bean id="classa" factory-bean="instanceFactory" factory-method="createClassA"/>
如上,获取ClassA类对象时,通过InstanceFactory类对象的 createClassA() 方法获取
③静态工厂
<bean id="classa" class="com.xt.factory.StaticFactory" factory-method="createClassA"/>
通过StaticFactory的静态方法createClassA() 获取对象
1.3 依赖注入
通过IOC,对象的创建交给了Spring容器;而对象的依赖关系通过依赖注入,也由spring控制
注入的数据:①基本类型、String ②其它bean ③集合类型
注入方式:①构造函数注入 ②setter方法 ③注解
(1)构造函数注入
构造函数需要的参数通过 constructor-arg标签传入
constructor-arg标签
name:参数在构造函数中的名称,常用
index:指定参数在构造函数参数列表中的索引位置(从0开始)
type:指定参数在构造函数中的数据类型
value:参数的值,只能是基本类型和String类型
ref:指定引用类型参数,可为其它配置过的bean类型
例:有一个类ClassA,其对象需要通过 有两个参数(例一个String name、一个int age)的构造函数 创建
<bean id="classa" class="com.xt.ClassA"> <constructor-arg name="name" value="xt"> </constructor-arg> <constructor-arg name="age" value="20"> </constructor-arg> </bean>
如果构造函数还需要一个引用类型参数,如Date date
<bean id="classa" class="com.xt.ClassA"> <constructor-arg name="name" value="xt"> </constructor-arg> <constructor-arg name="age" value="20"> </constructor-arg> <constructor-arg name="date" ref="now"> </constructor-arg> </bean> <bean id="now" class="java.util.Date"> </bean>
问题:
如果创建对象时用不到这些数据了,也必须要提供注入,否则无法创建对象
(2)setter方法
对象通过无参构造创建
通过property标签注入:
property标签
name:参数名(setter方法set字母后面那部分)
value:值,基本联系和String类型
ref:其它bean
例:ClassA有三个参数,有对应的setter方法
<bean id="classa" class="com.xt.ClassA"> <property name="name" value="xt"> </property> <property name="age" value="20"> </property> <property name="date" ref="now"> </property> </bean> <bean id="now" class="java.util.Date"> </bean>
String传递空串和null:
<bean id="classa" class="com.xt.ClassA"> <property name="str1" value=""/> <property name="str2"><null/></property> </bean>
------
注入集合数据:数组、List、Set、Map、Properties
通过构造或setter方式里面的子标签 <list>、<array>、<set> 、<map>、<entry>、<props>
例:ClassA需要这些集合类型参数
<bean id="classa" class="com.xt.ClassA"> <property name="myList"> <list> <value>A</value> <value>B</value> <value>C</value> </list> </property> <property name="myMap1"> <map> <entry key="key1" value="val1"/> <entry key="key2" value="val2"/> </map> </property> <property name="myProp"> <props> <prop key="key1">val1</prop> <prop key="key2">val2</prop> </props> </property> </bean>
2. 基于java配置类显示配置
3. 隐性的bean发现机制和自动装配
spring容器可在不使用 <constructor-arg>、<property>元素的情况下自动装配相互协作的bean之间的关系
<bean>的autowire属性:
no:默认,没有自动装配,需要显式指定
byName:根据属性名装配
byType:根据数据类型装配;如果存在多个匹配的类型,则出错
constructor:类似byType,此类型仅适用于构造函数参数类型,若容器中没有一个构造函数参数类型的bean,则出错
autodetect:spring首先尝试通过constructor使用自动装配连接,如果不行,则尝试通过byType
3. 自动装配
组件扫描:spring框架自动发现应用上下文中创建的bean
自动装配:spring框架自动满足bean之间的依赖
3.1
需要加入 spring-aop.jar
修改bean.xml文件为:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:annotation-config/> </beans>
3.2
注解:
3.2.1 用于创建对象的
注解的效果相当于<bean id="xxx" class="xxx" />
(1)@Component 表明这个类是一个组件类,告知spring为这个类创建bean
属性:
value:指定bean的id。不指定的id默认为当前类的类名,首字母小写
相应的配置:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:component-scan base-package="com.xt.abc.impl"> </context:component-scan> </beans>
<context:component-scan>标签:配置spring创建容器时要扫描的包
类的定义:
@Component(value = "classA") public class ClassA { private Date date; public void fun(){ System.out.println("classa test2"); } }
这个类在该标签指定的包下,当 getBean("classA")时即可获取ClassA类对象
(2)@Controller、@Service、@Repository
Controller一般用于表现层的注解;Service一般用在业务层;Repository用于持久层
这三个的作用和属性和Component是一样的
4.2 用于注入数据的
注解的效果相当于 <property name="xx" ref="xxx" />
(1)@Autowired
自动按类型注入。此注解只能注入其它bean类型。当容器中有唯一的一个bean对象,其类型与变量的类型匹配,则可以成功注入。
此注解放在成员上,则可以省略setter方法
如果容器里有多个和此变量类型匹配的bean对象,则 变量名字 和 bean对象在容器的key(即bean的id)进行匹配,有相同的则也可以成功注入。
(2)@Qualifier
属性: value 为指定bean的id
在自动按照类型注入的基础上,再安装bean的id注入。注入字段时要配合Autowire一起使用;给方法参数注入时,可以独立使用
(3)@Resource
属性:name 指定bean的id
直接按bean的id注入
(4)@Value
属性:value 指定值(可使用spring的el表达式)
注入基本类型数据和String类型
4.3 用于改变作用范围的
相当于 <bean id="xx" class="xxx" scope="xxxxx">
(1)@Scope
属性:value 指定范围取值
4.4 初始化、销毁方法
相当于<bean id="xx" class="xx" init-method="xx" destroy-method="xxx">
(1)@PostConstruct
指定初始化方法
(2)@PreDestroy
指定销毁方法
5. 新注解
(1)@Configuration
表示这个类是一个配置类
相对应的,获取容器中的对象之前,要使用 AnnotationApplocationContext(xxx.class) 而不是ClassPathXmlApplicationContext("xxx.xml")
@Configuration public class AppConfig{ @Bean public MyService myService1(){ return new MyServiceImpl1(); } @Bean public MyService myService2(){ return new MyServiceImpl2(); } }
等效于:
<beans> <bean id="myService1" class="com.xt.services.MyServiceImpl1" /> <bean id="myService2" class="com.xt.services.MyServiceImpl2" /> </beans>
使用:
ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class); MyService1 service1 = ctx.getBean(MyService1.class); MyService2 service2 = ctx.getBean(MyService2.class);
(2)@ComponentScan
通过注解指定spring创建容器时要扫描的包,相当于 xml 中的 basePackages
(3)@Bean
属性: name 给当前方法创建的对象指定名称,即bean的id(默认值为方法名)
方法注解,表面使用此方法创建一个对象,并且放入spring容器
(4)@PropertySource
属性:value[] 指定properties文件位置;在类路径下要写 classpath:
用于加载properties文件中的配置
(5)@Import
从另一个配置类中加载 @Bean 定义
-----------------------------------------------------------------------------------------------------------
通过依赖注入DI:相互协作完成功能的各个组件之间松散耦合
AOP:各种功能分离形成可重用的组件

浙公网安备 33010602011771号