1.spring简介
spring:开发框架
作用:简化企业应用开发,降低可侵入性
spring提供的IOC和AOP功能,可以将组件的耦合度降至最低,几解耦,便于系统的维护和升级
spring的本质是管理应用中的对象,即创建和维护对象之间的关系,也可以与第三方整合应用。
2.spring容器
在spring中,任何的java类和javaBean都被当成bean处理,这些Bean通过容器管理和使用
spring容器有BeanFactory和ApplicationContext两种类型
spring容器的实例化 ApplicationContext继承BeanFaction接口,拥有更多的企业级方法
加载工程classpath下的配置文件实例化
ApplicationContext ac=new ClassPathXmlApplicationContext(“配置文件路径”);
spring容器的使用
1.在容器配置文件 spring.xml中添加Bean定义(属性)
2.创建容器对象后,调用getBean方法获取实例
getBean(“标识符”)
3.Bean的作用域
spring容器在实例化Bean时,可以创建以下作用域的Bean对象
singleton:在spring容器中一个Bean定义对应一个实例对象,(默认项)
protorype:一个Bean定义对应多个实例对象
request:在一次Http请求中,一个Bean定义对应一个实例对象
session:再一次Http session中,一个Bean定义对应一个实例对象
Bean的作用域可以通过定义的scope属性指定
4.Bean的生命周期
指定初始化回调方法
<bean init-method=""/>
指定销毁的回调方法,仅适用于singleton模式的Bean
<bean destroy-method=""/>
在标签中的default-init-method属性,可以为容器中指定初始化回调方法,也可以通过default-dastory-method属性为容器中的bean指定销毁
回调方法
5.bean的延迟实例化
默认行为是在容器实例化的同时将单例,模式的bean提前实例化
延迟实例化操作:在声明时,指定其属性lazy-init为true,一个延迟实例化的bean将在第一次被用到时,实例化
注意:仅适用于单例模式
1.基于注解的组件扫描
组件扫描:
指定一个包路径,spring会自动扫描此包,及其子包中所有的组件类,当发现组件类定义前有特定的注解标记时,就将此组件纳入到spring容器中管理,
等价于原有的xml配置中的定义
组件扫描可以替大量xml配置的定义的scope属性指定
指定扫描类路径,使用组件扫描,需要在xml配置文件中指定扫描父集package路径
<context:component-scan base-package="com.xms"/>.
容器会自动扫描指定包下的组件类,如果此组件类定义前有特定的注解 标记,则将会此组件类实例化为bena对象
自动扫描的注解标记
@Component 通用注解
@Repository 持久层组件注解
@Service 业务层组件注解
@Controller 控制层组件注解
自动扫描组件的命名:
当一个组件在扫描过程中被检测到时,会生成一个默认的Id值,默认id值为小写开头的类名,也可以在注解标记中自定义id.
指定组件的作用域
通常受spring容器管理的组件,默认作用域是“singleton”,如果需要其他的作用域可以使用@scope注解,只要在注解中提供作用域的名称即可.
指定销毁和初始化的回调方法
@PreDestory 销毁回调方法
@PostConstruct 初始化回调方法
2.spring IOC
ioc全称 Inversion of Control 被翻译成控制反转
ioc是指程序中对象的获取方式发生反转,由最初的new方式创建,转变为由第三方框架创建,注入(DI),
他降低对象之间的耦合度
spring容器采用di方式实现ioc控制,ioc是spring框架的基础和核心
DI全称是 Dependency Injection,被翻译成依赖注入Di的基本原理是将一起工作具有关系的对象,通过方法参数传入,建立关系,因此容器的工作就是创建
Bean’对象时注入依赖关系
IOC是一种思想,而di是实现ioc的主要技术途径.
DI注入方式:
1.Setter注入
public class B(){
}
public class A(){
private B b;
public void setB(B b){
this.b=b;
}
}
a):容器实例化A,B组件
b):初始化,调用b属性的set方法
2.构造器注入
public class B{
}
public class A{
private B b;
public A(B b){
this.b=b;
}
}
a):容器在实例化A组件时,必须调用有参数的构造器
自动装配
spring容器可以自动装配autowire相互协作Bean之间的关联关系,autowire可以针对单个Bean进行设置,方便之处在于减少xml注入配置
在配置文件中可以在bean标签中使用autowire属性指定自动装配规则,一共三种类型值
byName:根据属性名自动装配 根据名字查找与属性名一致的bean (setter注入)
byType:若容器中存在一个指定属性类型相同的Bean,则与此属性自动装配 (setter注入) 比byName更加严谨
Constructor:与便于Type类似,但应用于构造器注入
3.参数值注入
1)注入基本值
标签可以通过字符串指定属性或构造器参数的值,容器将字符串从java.lang.String类型转换为实际的属性或构造器参数类型,
然后给bean对象注入.
2)注入bean对象
注入外部的bean(引用方式,方便重用)
3)注入集合
通过,,
这些都可以通过引用方式注入:
<util:list>.....
如:(以上格式相同)
<util:list id="list">
<value>123</value>
<value>456</value>
<value>789</value>
</util:list>
引用:
<bean id="xl" class="com.xms.entity.TestDemo">
<!-- list集合 -->
<property name="list" ref="list2"></property>
</bean>
4)注入spring表达式
spring表达式语言和el表达式在语法上很相似,可以读取一个Bean对象的属性或集合中的数据
5)注入null或空字符串
spring将属性空参数当做空字符串
如果需要注入NULL空值,可以使用<null>标签
<bean>
<property name="name">
<null/>
</property>
</bena>
1.基于注解的依赖注入
具有依赖关系的Bean对象,可以使用以下任意一种注解实现
@Autowired/@Qualifer:可以处理构造器注入hesetter注入; 也可以写在属性上,作用和写在方法上类似,但是只会执行一行代码(赋值代码)
注意:注入对象是单例时,@Qualifer可省略,此时springanz参数类型匹配参数值
@Autowired:写在构造器或set方法前,声明需要为其注入bean。
@Qualifer:写在参数前面,声明注入bean的ID
@Resource
只能处理setter注入
@Resource也可以希望在属性上,作用和色图、方法上类似,但只执行一行代码
注意:注入是单例时,(name=“标识符”)可省略
@Inject/@Named
和@Autowired/@Qualifer用法一致,需要额外的导包。
注入基本值或spring表达值
@Value注解可以注入基本值或spring表达值、
语法:
@value(“基本值”)
@Value("#{spring表达式}")