Spring
#spring: 核心组成部分 IOC+AOP
IOC:控制反转,将创建对象的操作交给Spring
AOP:面向切面,不修改源码实现功能的拓展
Spring的优点
- 通过IOC解耦,简化开发
- 支持AOP编程
- 便于测试
- 便于整合其他框架
基础的五个包:
5. beans
6. context
7. core
8. expression
9. logging
IOC容器
ioc:控制反转:将对象的创建及对象之间的调用过程,都交给spring
ioc底层:
工厂模式初步解耦
IOC的原理(对象工厂)
- 在xml文件中配置,配置创建的对象
<!--id 对象的唯一标识-->
<bean id="demo1" class="springdemo"></bean>
- 创建工厂类,实现 创建目标类的对象
- 解析xml文件得到class属性
String classValue = class属性
- 反射获取类
Class clazz = Class.forName(classValue)
- 创建类
clazz.new instance()
IOC容器实现的接口
//加载配置文件
ClassPathXmlApplicationContext context= new ClassPathXmlApplicationContext("pz.xml");
//创建对象name = xmlBean中的id
springdemo springdemo = context.getBean("deom1", springdemo.class);
- BeanFactory:Spring内部使用的接口,一般不用,加载配置文件时不创建对象。
-
ApplicationContext:1的子接口,一般使用这个接口,加载配置文件时创建对象。
applicationcontext的两个实现类:
ClassPathXmlApplicationContext:类路径加载
FileSystemXmlApplicationContext:文件系统路径加载
ApplicationContext ac = new ClassPathXmlApplicationContext("com/zzm/context/beans.xml");//等同路径:"classpath:com/zzm/context/beans.xml"
ac.getBean("abc",abc.calss);//就可以获得bean了
ApplicationContext ac = new FileSystemXmlApplicationContext("com/zzm/context/beans.xml");//等同路径:"file:com/zzm/context/beans.xml"
ac.getBean("abc",abc.calss);//就可以获得bean了
Bean管理
- Spring : 创建类的对象
- Spring : Spring注入属性
- Bean的作用域:单实例(默认)、多实例 。通过scope="prototype"设置为多实例,但此时在调用getbean才创建对象
- 生命周期:
1. 通过无参构造器创建bean实例
2. 为bean设置属性值
3. 调用bean的初始化方法
4. 使用bean对象
5. 关闭容器销毁bean
1. 创建对象:
在Spring配置文件xml文件中使用Bean标签,填写对应的参数,就可以实现对象的创建
<bean id="demo1" class="springdemo"></bean>
参数1:id:对象的唯一标识
参数2:class:创建对象的类的包路径
默认采用无参构造器
- 依赖注入(DI)在创建对象之后执行
- set方法注入:通过在bean标签中添加property标签实现注入 :name:属性的名称 value:属性值
<bean id="demo1" class="springdemo">
<property name="id" value="1" ></property>
</bean>
- 含参构造器注入:bean标签中添加constructor-arg标签
<bean id="cc" class="springdemo">
<constructor-arg name="id" value="5"></constructor-arg>
</bean>
注入bean:即 类的其中一个属性为 另一个类
目标::将对象2注入对象1
- 创建两个对象1,2
- 将对象1的name对应的value 关键字替换为ref =‘对象2’
<bean id="demo1" class="springdemo">
<property name="id" value="1" ></property>
<property name="d2" ref="demo2"></property>
</bean>
<bean id="demo2" class="deom2" >
<property name="name" value="ys"></property>
</bean>
注入:集合
<bean id="demo3" class="deom2">
<property name="list">
<array>
<!--value 替换为 ref 那么属性为 bean的id即可-->
<value>1</value>
<value>2</value>
<value>3</value>
<value>4</value>
</array>
</property>
<property name="maps">
<map>
<entry key="姓名" value="杨森"></entry>
<entry key="姓别" value="男"></entry>
</map>
</property>
</bean>
自动装配
根据指定的装配规则(属性名称,属性类型),Spring自动将属性值注入
加载配置文件中的信息
- 引入context名称空间
- 引入外部属性文件
- 配置
创建对象: Spring有四个注解创建对象:功能相同
@Component
@Service
@Controller
@Repository
创建对象步骤
- 1:引入AOPjar包,赋值修改xml文件前面几行
- 2: 开启组件扫描 : <context:component-scan base-package=“dao,service”/>
- 3:使用注解创建类的对象
value默认值为类的首字母小写后的名称。
创建对象
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("pz.xml");
Daotest dt = context.getBean("dt", Daotest.class);
dt.test();
基于注解的属性注入
- @Autowired:根据属性类型自动装配
@Autowired
private UserDao userDao;
若一个接口有两个实现类,那么单单用@Autowired无法识别注入哪个实现类。
2. @Qualifier:根据属性名注入,解决上述问题
@Autowired
@Qualifier(value = "UserDaoImpl1")
@Qualifier(value = "UserDaoImpl2")
private UserDao userDao;
此时可以通过@Qualifier的value设置注入哪个实现类
3. @Resource:根据属性名或者属性类型注入
对上面两种的整合,空参则默认注入,有name属性,则选则注入
@Resource(name = "UserDaoImpl2")
private UserDao userDao;
4 普通属性注入@value
@Value("张三")
private String name;
纯注解开发
- 创建配置类,替代xml配置文件(在配置类上加@Configuration,@ComponentScan(basePackage=“包”))
@Configuration
@ComponentScan(basePackages = {"service","dao"})
public class SpringConfig {
}
- 加载配置文件替换为 加载配置类
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
UserService us= context.getBean("userservice", UserService.class);
us.add();