主要内容
- Spring概念
- IOC容器
- AOP
- JDBCTemplate
- 事务管理
Spring框架概述
- 是一个轻量级的开源JavaEE框架
- 主要解决企业应用开发的复杂性
- 两个核心:IOC和AOP
- )IOC:控制反转,把创建对象过程交给Spring进行管理
- )AOP:面向切面,不修改源码进行功能增强。
- 特点:
- )方便解耦,简化开发
- )AOP编程支持
- )方便和其他框架进行整合
- )方便进行事务操作
- )降低API开发难度
IOC的概念和原理
什么是IOC?
控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。
简单来说:
- 把对象创建和对象之间的调用交给spring进行管理
- 目的;为了降低耦合度
IOC底层原理:xml解析、工厂模式、反射
IOC的发展过程
最初 通过new对象进行对象之间的创建和调用,但耦合性太强,一旦文件的路径发生改变或需要修改类里面的内容都比较麻烦。然后诞生了工厂模式,通过第三类的方式将对象进行创建并返回,方便需要的调用。这时只需要修改实际业务这一个类便能达到维护的目的。
然后为了进一步降低耦合度。(尽可能少修改源码情况下达到维护,不能像new对象一样修改一处,需要处处改,牵一发而动全身),演变成了IOC。
IOC(接口)
IOC思想基于IOC容器完成,IOC容器底层就是对象工厂。
spring提供了IOC容器的实现方式:(两个接口)
- BeanFactory:IOC容器的基本实现,是spring内部的使用接口,不提供开发人员使用。
- )加载配置文件的时候,不会创建对象,在获取对象(使用对象)时才会创建对象。
- ApplicationContext:BeanFactory接口的子接口,提供更多更强大的功能,一般由开发人员进行使用。
- )加载配置文件时候就会把在配置文件中的对象进行了创建。
File表示磁盘路径(绝对路径),class表示src路径(相对路径)。
IOC操作Bean管理
什么是Bean管理
- spring创建对象
- spring注入属性
Bean管理操作的两种方式
- xml配置文件方式实现
- 注解方式实现
基于XML方式
1 基于xml方式创建对象
<!--1 配置User对象创建-->
<bean id="user" class="com.cy.User"></bean>
<!--
1 在spring配置文件中,使用bean标签,标签里面添加对应属性,就可以对象的创建
2 在bean标签有很多属性 其中:
id: 唯一表示
class: 类全路径(包类路径)
3 创建对象时候,默认也是执行无参构造方法完成对象的创建
-->
2 属性注入
- set方法注入属性
- 有参构造属性注入
<?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">
<!--1 配置User对象创建-->
<bean id="user" class="com.cy.User"></bean>
<!--
1 在spring配置文件中,使用bean标签,标签里面添加对应属性,就可以对象的创建
2 在bean标签有很多属性 其中:
id: 唯一表示
class: 类全路径(包类路径)
3 创建对象时候,默认也是执行无参构造方法完成对象的创建
-->
<!--2 set方法注入属性-->
<bean id="book" class="com.cy.Book">
<!--使用property完成属性注入
name: 类里面属性名称
value:向属性注入的值
-->
<property name="bname" value="易筋经"></property>
<property name="bauthor" value="达摩老祖"></property>
</bean>
<!--3 有参构造注入属性-->
<bean id="orders" class="com.cy.Orders">
<constructor-arg name="oname" value="abc"></constructor-arg>
<constructor-arg name="address" value="China"></constructor-arg>
</bean>
</beans>
注入属性--外部bean
- 创建两个类service类和dao类
- 在service中调用dao里面的方法
- 在spring配置文件中进行配置
package com.cy.service;
import com.cy.dao.UserDao;
import com.cy.dao.UserDaoImpl;
public class UserService {
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void add(){
System.out.println("service add....");
/*原始方式
UserDao userDao = new UserDaoImpl();
userDao.update();*/
userDao.update();
}
}
package com.cy.dao;
public interface UserDao {
public void update();
}
package com.cy.dao;
public class UserDaoImpl implements UserDao{
@Override
public void update() {
System.out.println("dao update....");
}
}
<?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="userService" class="com.cy.service.UserService">
<!-- 注入userDao对象
name属性: 类里面属性的名称
ref属性: 创建userDao对象bean标签id值
-->
<property name="userDao" ref="userDaoImpl"></property>
</bean>
<bean id="userDaoImpl" class="com.cy.dao.UserDaoImpl"></bean>
</beans>
package com.cy.bean;
public class Dept {
private String dname;
public void setDname(String dname){
this.dname = dname;
}
@Override
public String toString() {
return "Dept{" +
"dname='" + dname + '\'' +
'}';
}
}
package com.cy.bean;
/**
* 员工类
*/
public class Emp {
private String ename;
private String gender;
/*员工属于某一个部门,使用对象形式表示*/
private Dept dept;
public void setDept(Dept dept) {
this.dept = dept;
}
public void setEname(String ename) {
this.ename = ename;
}
public void setGender(String gender) {
this.gender = gender;
}
}
<?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-->
<bean id="emp" class="com.cy.bean.Emp">
<!--设置两个普通属性-->
<property name="ename" value="lucy"></property>
<property name="gender" value="女"></property>
<!-- 设置对象类型属性-->
<property name="dept">
<bean id="dept" class="com.cy.bean.Dept">
<property name="dname" value="安保部"></property>
</bean>
</property>
</bean>
</beans>
注入属性--级联赋值
第一种写法
<?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-->
<bean id="emp" class="com.cy.bean.Emp">
<!--设置两个普通属性-->
<property name="ename" value="lucy"></property>
<property name="gender" value="女"></property>
<!-- 设置对象类型属性-->
<property name="dept" ref="dept"></property>
</bean>
<bean id="dept" class="com.cy.bean.Dept">
<property name="dname" value="财务部"></property>
</bean>
</beans>
第二种写法
<?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-->
<bean id="emp" class="com.cy.bean.Emp">
<!--设置两个普通属性-->
<property name="ename" value="lucy"></property>
<property name="gender" value="女"></property>
<!-- 设置对象类型属性-->
<property name="dept" ref="dept"></property>
<property name="dept.dname" value="技术部"></property>
</bean>
<bean id="dept" class="com.cy.bean.Dept">
<!--<property name="dname" value="财务部"></property>-->
</bean>
</beans>
资料来源:尚硅谷-Spring5框架最新版教程(idea版)
https://www.bilibili.com/video/BV1Vf4y127N5?p=13&spm_id_from=pageDriver