文章目录
概述
Spring是开源的J2EE应用程序框架
目的是解决企业应用开发的复杂性
Spring有两个核心部分:IOC和Ao
IOC:控制反转,把创建对象过程交给Spring管理
Aop:面向切面,不修改源代码进行功能增强
Spring特点:
方便解耦,简化开发
Aop编程指出
方便程序的测试
方便和其他框架进行整合
方便进行事务的操作
降低API开发
入门案例
1.下载Spring5
https://repo.spring.io/release/org/springframework/spring/5.3.6/
2.导入jar包
2.写一个User类
3.写Spring.xml内创建类对象
<!--配置User类的对象的创建-->
<bean id="user" class="com.yuan.spring5.User"></bean>
4.测试调用配置文件的对象
@Test
public void testAdd(){
//加载Spring的配置文件
ApplicationContext context =
new ClassPathXmlApplicationContext("bean1.xml");
//获取创建的对象
User user = context.getBean("user", User.class);
user.add();
}
IOC容器(IOC底层原理)
概念:把对象创建和对象之间的调用过程,交割Spring进行管理
底层原理:xml解析 - > 工厂模式 - > 反射
<bean id="user" class="com.yuan.spring5.User"></bean>
对上面的xml代码进行dom4j解析出class后面的类路径,然后就可以在工厂类中通过class.forname创建出类路径的类对象,实现对象的调用,这就实现了解耦,以后只需要修改xml内的class属性就可以让对象调用不同的对象,而不需要去修改代码。
IOC(接口)
1.IOC容器底层就是对象工厂
2.Spring提供IOC容器实现两种方式:(两个接口)
(1)BeanFactory:
IOC容器基本实现,内部的使用的接口,一般不提供给我们使用
(2)AppliactionContext
BeanFactory接口的子接口,提供更多更强大的接口,使用
ApplactionContext是加载配置文件的时候就会把配置文件对象进行创建,饿汉式
BeanFactory是懒汉式
ApplicationContext比较好,一开始就创建所有对象,方便后面调用对象。
AppliactionContext接口的常用实现类
FileSystemXmlApplicationContext(写入盘符的路径)
ClassPathXmlApplicationContext(写入src下的文件路径)
IOC操作bean管理
Bean管理指的是两个操作:Spring创建对象,Spring注入属性
Bean管理操作有两种方式:
基于xml配置文件方式实现
基于注解方式实现
基于xml方式的bean管理
1.创建对象
1<bean id="user" class="com.yuan.spring5.User"></bean>
Bean标签有很多属性:
Id属性 给对象起一个别名,就像Map中的key标识
Calss属性 类的全路径:包+类
2.注入属性
(1)DI依赖注入-set和构造器两种方法
set方法
- 1.创建类,定义属性和set方法
- 2.配置xml
<!--注入属性-->
<bean id="book" class="com.yuan.spring5.Book">
<!--使用property完成属性注入-->
<property name="bname" value="西游记"></property>
<property name="bauthor" value="罗贯中"></property>
</bean>
构造器方法
- 1.创建类,定义属性和构造器
- 2.配置xml
<!--注入属性通过构造器方法-->
<bean id="book2" class="com.yuan.spring5.Book">
<constructor-arg name="bname" value="月朗星稀"></constructor-arg>
<constructor-arg name="bauthor" value="尼玛"></constructor-arg>
</bean>
Xml注入其他类型的属性
<!--设置属性为null值-->
<property name="address">
<null/>
</property>
<!--设置特殊字符-->
<property name="address" value="<南京>"></property>
(2)注入属性-外部bean
1创建两个类 Service和Dao
2在service内调用Dao类的方法 生成Dao对象和set方法
public class UserService {
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void add(){
System.out.println("service.add>>>>>>");
userDao.update();
}
}
3在spring的配置文件中配置 ref关键属性值 传入另一个bean对象的id值
<!--service和dao对象的创建和注入-->
<bean id="userService" class="com.yuan.spring5.service.UserService">
<!--注入userDao对象-->
<property name="userDao" ref="userDaoImpl"></property>
</bean>
<bean id="userDaoImpl" class="com.yuan.spring5.dao.UserDaoImpl"></bean>
(3)注入属性-内部bean和级联赋值
一对多关系,部门和员工
public class Emp {
private String ename;private String gender;
//员工属于某一个部门
private Dept dept;
public void setGender(String gender) {
this.gender = gender;
}
public void setDept(Dept dept) {
this.dept = dept;
}
public void setEname(String ename) {
this.ename = ename;
}
}
Xml内对bean内加入另一个bean
<!--内部bean-->
<bean id="emp" class="com.yuan.spring5.bean.Emp">
<property name="ename" value="小豪"></property>
<property name="gender" value="男"></property>
<property name="dept">
<bean id="dept" class="com.yuan.spring5.bean.Dept">
<property name="dname" value="保安部"></property>
</bean>
</property>
</bean>
Xml注入集合属性
注入数组类型,Map类型,Set类型的集合类属性
创建属性,生成对应的set方法
配置xml文件
<bean id="stu" class="com.yuan.spring5.Stu">
<property name="course">
<!--数组集合注入-->
<array>
<value>java课程</value>
<value>C#课程</value>
</array>
</property>
<!--List集合注入-->
<property name="list">
<list>
<value>sdcs</value>
<value>cdsc</value>
</list>
</property>
<!--Map集合注入-->
<property name="maps">
<map>
<entry key="1" value="abc"></entry>
<entry key="2" value="cba"></entry>
</map>
</property>
<!--Set集合注入-->
<property name="maps2">
<set>
<value>1</value>
<value>2</value>
</set>
</property>
</bean>
在集合内放入对象类
设置set方法
在xml文件内创建course对象的bean类,
<bean id="course1" class="com.yuan.spring52.Collection.Course">
<property name="cname" value="语文"></property>
</bean>
<bean id="course2" class="com.yuan.spring52.Collection.Course">
<property name="cname" value="数学"></property>
</bean>
然后在stu的bean内设置list属性注入多个course的bean
<!--注入对象数组,引入外部多个bean对象到list集合内-->
<property name="courselist">
<list>
<ref bean="course1"></ref> 已经在外部设置好的bean对象
<ref bean="course2"></ref> 同上
</list>
</property>
把集合注入部分提取出来
利用util标签,需要在头部导入配置信息
<util:list id="courselist">
<ref bean="course1"></ref>
<ref bean="course2"></ref>
</util:list>
这样之间调用courselist就可以注入准备好的两个course类
<!--注入对象数组,引入外部多个bean对象到list集合内-->
<property name="courselist" ref="courselist">
</property>
FactoryBean 工厂bean
之前用的Bean是普通bean
普通bean: 在配置文件中定义的bean类型就是返回类型
工厂bean: 在配置文件中定义的bean类型可以和返回类型不一样
Bean的作用域
在Spring,设置创建的bean实例可以是单例模式也可也不是
默认情况下是单例模式,bean都只创建一个实例对象,复用,对象的地址是相同的
设置多例模式则在bean内设置
scope:prototype
则现在生成的对象的地址不同,不是同一个对象
Bean的生命周期
- 1通过构造器创建bean的实例(无参数构造)
- 2为bean的属性设置值(set方法)
- 3调用bean的初始化方法(需要进行配置initMethod)
- 4 生成bean实例化对象
- 5当容器在关闭的时候,调用bean的销毁方法(需要配置destoryMethod)
初始化和销毁的方法设置在类内,然后在xml的bean内加入属性值:
<bean id="orders" class="com.yuan.spring53.Orders"
init-method="initMethod"
destroy-method="destoryMethod" >
测试结果:
添加后置处理器则会使bean变成7个生命周期 继承此BeanPostProcessor即可
如果加上,则会在初始化阶段的上下加入两个方法,分别为:
postProcessBeforeInitialization 和 postProcessAfterInitialization
就变成了7步周期
Xml自动装配
根据指定的装配规则,Spring自动将匹配的属性值进行注入
Autowire属性:
- byName根据属性名称注入
- byType 根据属性类型注入
<!--
实现自动装配
bean标签属性autowire,自动装配
有两个值:
byName:根据属性名称注入
byType:根据属性类型注入
-->
<bean id="emp" class="com.yuan.autowire.Emp" autowire="byName">
</bean>
<bean id="dept" class="com.yuan.autowire.Dept"></bean>
引入外部属性文件
1.一般的创建连接池方式
<!--配置连接池-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc://mysql://localhost:3306/userDb"></property>
<property name="username" value="root"></property>
<property name="password" value="yuan"></property>
</bean>
2.引入外部的properties来自动设置连接池的参数
引入context名称空间标签
<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:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>
<!--配置连接池 引入外部的文件,这样直接修改外部文件,就可以改变生成的连接池对象-->
<bean id="dataSource2" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${prop.driverClass}"></property>
<property name="url" value="${prop.url}"></property>
<property name="username" value="${prop.username}"></property>
<property name="password" value="${prop.password}"></property>
</bean>
引入外部的文件,这样直接修改外部文件,就可以改变生成的连接池对象
以上是我在尚硅谷视频学习的笔记总结