Spring5 简介与IOC核心
Spring5 简介与IOC核心
1、Spring是一款轻量级的开源javaEE框架
2、Spring的作用:解决企业应用开发的复杂性
3、Spring的核心:IOC和Aop
(1)IOC: 将耦合度降到最低
一、控制反转,把创建对象和对象之间的调用过程交给Spring管理
使用IOC的目的:为了耦合度降低
入门案例:如5、(1)所示
二、底层原理
xml解析、工厂模式、反射
三、使用过程
第一步:创建XML文件,配置创建的对象<bean id = “类对象的名字” class = “全类名(包括包名)”></bean>
第二步:创建工厂设计模式类
class User{
public static User getUser(){
String userValue = class属性值;//1.xml解析获取
Class clazz = Class.forName(userValue);
return (UserDao)clazz.newInstance();
}
}
四、IOC接口
1.IOC的思想要基于IOC容器完成。IOC容器底层就是工厂
2.Spring提供了两种容器的实现方式:(两个接口)
(1)BeanFactory:IOC容器的基本实现,是Spring内部使用的接口,一般不提供给开发人员使用
特点:加载配置文件的时候不会创建对象,只会在获取(使用)对象的时候进行创建
(2)ApplicationContext:BeanFactory的子接口,提供更多更强大的接口,一般由开发人员使用
特点:加载配置文件的时候就会把配置文件的对象进行创建
主要实现类:
1、FileSystemXmlApplicationContext 在盘目录下的XML文件
2、ClassPathXmlApplicationContext 在src下的XML文件
(2)Aop:面向切面,不修改源代码进行功能增强
4、Spring的特点:
(1)方便解耦,简化开发
(2)Aop编程支持
(3)方便程序测试
(4)方便和其他框架进行整合
(5)方便进行事务的操作
(6)降低API开发难度
5、Spring的使用:
(1)对象的创建:
在Spring框架中创建对象是使用配置文件。
如: 已经创建了类User 往常使用User user = new User(); //创建类的对象
现在是在src下创建Spring框架XML配置文件 使用<bean id = “类对象的名字” class = “全类名(包括包名)”></bean>
(2)IOC的具体操作:
Bean管理:由Spring创建对象 由Spring注入属性
Bean管理操作的基本实现方式:
1.基于XML配置文件方式实现
基于XML配置文件实现创建对象 <bean id = “类对象的名字” class = “全类名(包括包名)”></bean>
基于XML配置文件实现属性注入
(1)DI:依赖注入,即注入属性
第一种方式 使用set方法进行注入
<bean id = “类对象的名字” class = “全类名(包括包名)”><property name=”属性的属性名” value=”赋给属性的值”></property></bean>
<bean id = “类对象的名字” class = “全类名(包括包名)”><property name=”属性的属性名”><null/></property></bean> //设置空值
<bean id = “类对象的名字” class = “全类名(包括包名)”><property name=”属性的属性名”><value><![CDATA[<<南京>>]]></value></property></bean> //设置空值
外部连接 <bean id = “类对象的名字” rep = “另一个bean标签的id”><property name=”属性的属性名” value=”赋给属性的值”></property></bean>
内部连接
<bean id="emp" class="com.xxx.spring5.bean.Emp">
<property name="ename" value="yy"></property>
<property name="gender" value="女"></property>
<property name="dept">
<bean id="dept" class="com.lianyou.spring5.bean.Dept">
<property name="dname" value="行政部"></property>
</bean>
</property>
</bean>
级联赋值
<bean id="emp" class="com.lianyou.spring5.bean.Emp">
<property name="ename" value="yy"></property>
<property name="gender" value="女"></property>
<property name="dept" ref="dept"></property>
</bean>
<bean id="dept" class="com.lianyou.spring5.bean.Dept">
<property name="dname" value="行政部"></property>
</bean>
数组赋值
<bean id="stu" class="com.xxx.spring5.bean.StuBean">
<property name="arr">
<array>
<value>123</value>
<value>abc</value>
</array>
</property>
<property name="list">
<list>
<value>123</value>
<value>abc</value>
</list>
</property>
<property name="map">
<map>
<entry key="a" value="b"></entry>
<entry key="1" value="2"></entry>
</map>
</property>
<property name="set"><set><value>a</value></set></property>
</bean>
在数组中注入对象
<bean id="list" class="com.xxx.spring5.bean.StuBean"><property name="courseList"><list><lef bean="course1"></ref></list></property></bean>
<bean id="course" class="com.xxx.spring5.bean.Course"><property name="course1" value="aaa"></property></bean>
提取list注入
<util:list id=”bookList”>
<value>易筋经</value> <value>九阴真经</value> <value>九阳神功</value> </util:list>
<bean id=”book” class=”com.atguigu.spring5.collectiontype.Book”> <property name=”list” ref=”bookList”></property> </bean>
第二种方式 使用有参构造的方式进行注入
<bean id = “类对象的名字” class = “全类名(包括包名)”><constructor-arg name=”属性的属性名” value=”赋给属性的值”></constructor-arg></bean>
IOC操作 Bean 管理( FactoryBean)
1、Spring有两种类型bean,一种普通bean,另外一种工厂bean(FactoryBean)
2、普通bean:在配置文件中定义bean类型就是返回类型
3、工厂bean:在配置文件定义bean类型可以和返回类型不一样
第一步 创建类,让这个类作为工厂bean,实现接口 FactoryBean
第二步 实现接口里面的方法,在实现的方法中定义返回的bean类型
IOC操作 Bean 管理( bean 作用域)
1、在Spring里面,设置创建bean实例是单实例还是多实例
2、在Spring里面,默认情况下,bean是单实例对象
3、如何设置单实例还是多实例
(1)在spring配置文件bean标签里面有属性(scope)用于设置单实例还是多实例
(2)scope属性值
第一个值 默认值,singleton,表示是单实例对象
第二个值 prototype,表示是多实例对象
(3)singleton和prototype区别
第一 singleton单实例,prototype多实例
第二 设置scope值是singleton时候,加载spring配置文件时候就会创建单实例对象
设置scope值是prototype时候,不是在加载spring配置文件时候创建 对象,在调用getBean方法时候创建多实例对象
IOC
操作 Bean 管理( bean 生命周期)
1、生命周期
(1)从对象创建到对象销毁的过程
2、bean生命周期
(1)通过构造器创建bean实例(无参数构造)
(2)为bean的属性设置值和对其他bean引用(调用set方法)
(3)调用bean的初始化的方法(需要进行配置初始化的方法)
(4)bean可以使用了(对象获取到了)
(5)当容器关闭时候,调用bean的销毁的方法(需要进行配置销毁的方法)
3、bean的后置处理器,bean生命周期有七步
(1)通过构造器创建bean实例(无参数构造)
(2)为bean的属性设置值和对其他bean引用(调用set方法) (3)把bean实例传递bean后置处理器的方法postProcessBeforeInitialization
(4)调用bean的初始化的方法(需要进行配置初始化的方法)
(5)把bean实例传递bean后置处理器的方法 postProcessAfterInitialization
(6)bean可以使用了(对象获取到了)
(7)当容器关闭时候,调用bean的销毁的方法(需要进行配置销毁的方法)
IOC操作 Bean 管理 外部属性文件
1、直接配置数据库信息
(1)配置德鲁伊连接池
(2)引入德鲁伊连接池依赖jar包
<!–直接配置连接池–>
<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=”root”></property> </bean>
2、引入外部属性文件配置数据库连接池
(1)创建外部属性文件,properties格式文件,写数据库信息
driverClass=com.mysql.jdbc.Driver
url=jdbc://localhost:3306/books
userName=root
password=1234
(2)把外部properties属性文件引入到spring配置文件中
* 引入context名称空间<?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:property-placeholder location="classpath:jdbc.properties"/>
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${driverClass}"></property>
<property name="url" value="${url}"></property>
<property name="username" value="${userName}"></property>
<property name="password" value="${password}"></property>
</bean>
</beans>
2.基于注解方式实现
IOC
操作 Bean 管理 基于注解方式
1、什么是注解
(1)注解是代码特殊标记,格式:@注解名称(属性名称=属性值, 属性名称=属性值..)
(2)使用注解,注解作用在类上面,方法上面,属性上面
(3)使用注解目的:简化xml配置
2、Spring针对Bean管理中创建对象提供注解
(1)@Component
(2)@Service
(3)@Controller
(4)@Repository
* 上面四个注解功能是一样的,都可以用来创建bean实例
3、基于注解方式实现对象创建
第一步 引入依赖
第二步 开启组件扫描 <!–开启组件扫描 1 如果扫描多个包,多个包使用逗号隔开 2 扫描包上层目录 –>
<context:component-scan base-package=”com.包名”></context:component-scan>
第三步 创建类,在类上面添加创建对象注解 //在注解里面value属性值可以省略不写, //默认值是类名称,首字母小写 //UserService — userService
@Component(value = “userService”) //<bean id=”userService” class=”..”/>
public class UserService { public void add() { System.out.println(“service add…….”); } }
4、开启组件扫描细节配置 <!–示例1 use-default-filters=”false” 表示现在不使用默认filter,自己配置filter context:include-filter ,设置扫描哪些内容 –>
<context:component-scan base-package=”com.atguigu” use-default-filters=”false”>
<context:include-filter type=”annotation” expression=”org.springframework.stereotype.Controller”/></context:component-scan>
<!–示例2 下面配置扫描包所有内容 context:exclude-filter: 设置哪些内容不进行扫描 –>
<context:component-scan base-package=”com.atguigu”><context:exclude-filter type=”annotation” expression=”org.springframework.stereotype.Controller”/>
</context:component-scan>
5、基于注解方式实现属性注入
(1)@Autowired:根据属性类型进行自动装配
第一步 把service和dao对象创建,在service和dao类添加创建对象注解
第二步 在service注入dao对象,在service类添加dao类型属性,在属性上面使用注解
@Service
public class UserService {
//定义dao类型属性
//不需要添加set方法
//添加注入属性注解
@Autowired
private UserDao userDao;
public void add() { System.out.println(“service add…….”); userDao.add(); } }
(2)@Qualifier:根据名称进行注入
这个@Qualifier注解的使用,和上面@Autowired一起使用 //定义dao类型属性 //不需要添加set方法
//添加注入属性注解 @Autowired //根据类型进行注入 @Qualifier(value = “userDaoImpl1”) //根据名称进行注入 private UserDao userDao;
(3)@Resource:可以根据类型注入,可以根据名称注入 //@Resource //根据类型进行注入 @Resource(name = “userDaoImpl1”) //根据名称进行注入 private UserDao userDao;
(4)@Value:注入普通类型属性 @Value(value = “abc”) private String name;
6、完全注解开发
(1)创建配置类,替代xml配置文件 @Configuration //作为配置类,替代xml配置文件 @ComponentScan(basePackages = {“com.atguigu”}) public class SpringConfig { }
(2)编写测试类 @Test public void testService2() { //加载配置类 ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class); UserService userService = context.getBean(“userService”, UserService.class); System.out.println(userService); userService.add(); }