Spring概述
目录
使用JdbcTemplate自带的方法完成对数据库的增删查改操作
1、Spring 是轻量级的开源的JavaEE框架
2、Spring可以解决企业应用开发的复杂性。特点:
(1) 方便解耦,简化开发。
(2) Aop编程支持。(Aop:不修改源代码的情况下进行功能增强)(3)方便程序测试
(4)方便和其他框架进行整合+
(5) 方便进行事务操作。
(6)降低AI开发难度。P
IOC容器
概念
(1)控制反转,把对象创建和对象之间的调用过程,交给Spring进行管理。
(2) 使用IOC目的:为了耦合度降低(3)IOC思想基于IOC容器完成,IOC 容器底层就是对象工厂。
底层原理
xml解析,工厂模式,反射
Spring提供IOC容器实现两种方式
基于xml方式实现属性注入和对象创建
属性注入
1. 在类中通过set方法注入属性的值
2.通过在xml中使用property标签注入
<!--name:类中的属性名;value:向属性注入的值-->
<property name ="XXX" value="X"></property>
3. 有参构造注入属性(在xml的bean标签中)
<!--有参数的构造方法用此方式进行属性的注入-->
<constructor-arg name="name" value="abc"></constructor-arg>
<constructor-arg name="address" value="China" ></constructor-arg>
<!--可以通过参数的索引设置属性值-->
<constructor-arg index="0" value="China" ></constructor-arg>
4.xml中注入其他属性
5.外部bean的注入
<bean id="userService" class="com.zc.spring5.service.UserService">
<!--注入userDao对象
name属性:类里面属性名称
ref属性:创建userDao对象bean标签id值-->
<property name="userDao" ref="userDao"></property>
</bean>
<bean id="userDao" class="com.zc.sping5.dao.UserDaoImpl"></bean>
6.内部bean
在一个bean的内部的property属性的内部再配置一个bean,然后再在这个bean中配置它的property等
xml注入集合属性
·1.普通集合属性注入
<bean id="student" class="com.zc.spring5.collectiontype.Student">
<!--数组类型属性注入-->
<property name="cources">
<array>
<value>java课程</value>
<value>数据库课程</value>
</array>
</property>
<!--list属性注入-->
<property name="list">
<list>
<value>小明</value>
<value>小黑</value>
</list>
</property>
<!--map类型属性注入-->
<property name="maps">
<map>
<entry key="JAVA" value="JAVA"></entry>
<entry key="RUST" value="rust"></entry>
</map>
</property>
</bean>
2.对象集合属性注入
<!--对象集合注入-->
<bean id="student" class="com.zc.spring5.collectiontype.Student">
<property name="courseList">
<list>
<ref bean="course1"></ref>
<ref bean="course2"></ref>
</list>
</property>
</beans>
<bean id="course1" class="com.zc.spring5.collectiontype.Course">
<property name="name" value="计算机课程"></property>
</bean>
<bean id="course2" class="com.zc.spring5.collectiontype.Course">
<property name="name" value="javaEE课程"></property>
</bean>
3.设置公共的集合注入
Spring中的bean类型
1.普通bean
在配置文件中定义的bean类型就是返回类型
例:
<bean id="student" class="com.zc.spring5.collectiontype.Student"></bean>
在测试代码中的返回类型:
Student student=context.getBean("student",Student.class);
2.FactoryBean
在配置文件中定义的bean类型可以和返回类型不一样
实现:
第一步创建类,让这个类作为工厂bean, 实现接口FactoryBeany
第二步实现接口里面的方法,在实现的方法中定义返回的bean类型。
bean的作用域
1.在默认情况下,Spring里面的bean是单实例对象——同一个类的对象的地址值相同
2.设置bean的单多实例
bean的生命周期
XML自动装配
概念:根据指定装配规则(属性名称或者属性类型),Spring 自动将匹配的属性值进行注入。
实现:
实现自动装配
bean标签属性autowire,配置自动装配
autowire属性常用两个值:
byName根据属性名称注入,注入值bean的id值和类属性名称一-样
byType根据属性类型注入
<bean id="emp" class="com.atguigu.spring5.autowire.Emp" autowire="byName">
<!--手动装配-->
<!--<property name= "dept" ref="dept">< property>-->
</bean>
<bean id="dept" class="com.atguigu.spring5.autowire.Dept" ></ bean
外部属性文件
1.创建外部属性文件(propertise格式文件)-例如写数据库连接信息的propertise文件(jdbc.propertises)
2.将外部的propertise文件引入到spring配置文件中
2.1.引入context名称空间
2.2.在spring配置文件使用标签引入外部属性文件。
2.3.配置属性值
基于注解方式注入属性和对象创建
注解概述
Spring针对Bean管理中创建对象提供注解
(1) @Component
(2) @Servicer
(3) @Controller
(4) @Repository*上述注解功能是一样的,都可以用来创建bean实例,但开发中一般将其运用在对应层中。
基于注解方式实现对象创建
1.引入依赖
spring-aop-5.2.6.RELEASE.jar
2.引入名称空间
<?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
">
3.开启组件扫描(如有多个包,多个包使用逗号隔开;直接写包含该类的上层目录即可)
<context:component-scan base-package="com.zc.dao"></context:component-scann>
<!--写法二-->
<!--<context:component-scan base-package="com.zc"></context:component-scann>-->
4.创建类,在类上面添加创建对象注解
例:@Service(value = "userService")其中value可以不写,默认就是类名首字母小写
基于注解方式实现属性注入
(1) @AutoWired:根据属性类型自动装配
1.把service和dao对象创建,在service和dao类添加创建对象注解
2.在service注入dao对象,在service类添加dao类型属性,在属性上面使用注解
@Service public class UserService { @Autowired private UserDao userDao; public void add(){ System.out.println("service add......"); userDao.add(); } }
(2) @Qualifier:根据属性名称进行注入
此注解需要与@AutoWired注解一起使用
//service中代码 @Autowired @Qualifier(value = "userDaoImpl") private UserDao userDao; //实现接口的UserDaoImpl中代码 @Repository(value = "userDaoImpl") public class UserDaoImpl implements UserDao { @Override public void add() { System.out.println("UserDaoImpl实现的add方法..."); } }
(3) @Resource:既可以类型也可以根据名称注入
1.根据类型:@resource
2.根据名称:@resource(name="userDaoImpl")
(4)@Value:注入普通类型属性
向name中注入abc
纯注解开发
1.创建配置类,替代xml配置文件
@Configuration //配置类
@ComponentScan(basePackages = {"com.zc"})
public class SpringConfig {
}
2.编写测试类
@Test
public void testService1(){
//加载配置类
ApplicationContext context=new AnnotationConfigApplicationContext(SpringConfig.class);
UserService userService = context.getBean("userService", UserService.class);
userService.add();
}
AOP
概念
(1)面向切面编程(方面),利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
(2)不通过修改源代码的方式添加新的功能
底层原理
1、AOP底层使用动态代理。
(1)有两种情况动态代理
第一种有接口情况,使用JDK动态代理。
第二种没有接口情况,使用CGLIB动态代理
AOP术语
1.连接点
类里面哪些方法可以被增强,这些方法就被称为连接点
2.切入点
实际被真正增强的方法,称为切入点
3.通知(增强)
(1)实际增强的逻辑部分称为通知
(2)通知的类型
*前置通知
*后置通知
*环绕通知
*异常通知
*最终通知4.切面
把通知应用到切入点的过程
AOP操作准备
AspectJ注解
1.创建类,在类里面定义方法。
public class User {
public void add(){
System.out.println("add...");
}
}
2.创建增强类(编写增强逻辑)
public class UserProxy {
public void before(){
System.out.println("before...");
}
}
3.进行通知配置
(1)在spring配置文件中,开启注解扫描。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
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
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<context:component-scan base-package="com.zc.spring5.AOP"></context:component-scan>
</beans>
(2)使用注解创建User和UserProxy对象
(3)在增强类,上面添加注解@Aspect
(4)在spring配置文件中开启生成代理对象。
<!--开启Aspect生成代理对象-->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
4.配置不同类型通知
(1)在增强类的里面,在作为通知方法上面添加通知类型注解,使用切入点表达式配置
@Component
@Aspect
public class UserProxy {
//前置通知
@Before(value = "execution(* com.zc.spring5.AOP.User.add(..))")
public void before(){
System.out.println("before...");
}
}
5.相同切入点抽取
6.有多个增强类都对同一个方法进行增强,设置增强类优先级。
JdbcTemplate
概念
Spring框架对JDBC进行封装,使用JdbcTemplate方便实现对数据库操作。
准备工作
1.引入jar包
2.在spring配置文件配置数据库连接池
<!-- 数据库连接池 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
destroy-method="close">
<property name="url" value="jdbc:mysql:///user_db" />
<property name="username" value="root" />
<property name="password" value="root" />
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
</bean>
3.配置JdbcTemplate对象,注入DataSource
4.创建service类,创建dao.类,在dao注入jdbcTemplate对象
使用JdbcTemplate自带的方法完成对数据库的增删查改操作
事务
概念
事务是数据库操作最基本单元,逻辑.上一-组操作,要么都成功,如果有一个失败所有操
作都失败。
事务四个特性(ACID)
(1)原子性
(2)一致性
(3) 隔离性
(4) 持久性
搭建事务操作环境
1.创建数据库
2.创建service,dao(数据访问层),完成对象创建和注入关系
service注入dao, 在dao注入JdbcTemplate, 在JdbcTemlate注入DataSource
3.在dao和service中创建方法
Spring事务管理介绍
1、事务添加到JavaEE三层结构里面Service层(业务逻辑层)
2.、在Spring进行事务管理操作。
有两种方式:编程式事务管理(上述方式)和声明式事务管理(通常使用)3、声明式事务管理。
(1)基于注解方式。(使用)
(2)基于xml配置文件方式
4、在Spring进行声明式事务管理,底层使用AOP5、Spring 事务管理API
提供一个接口,代表事务管理器,这个接口针对不同的框架提供不同的实现类
注解声明式事务管理
1.在spring配置文件配置事务管理器
<!--创建事务管理器-->
<bean id="tranctionmanager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--注入数据源-->
<property name="dataSource" ref="dataSource"></property>
</bean>
2.在spring配置文件,开启事务注解
(1)在spring配置文件引入名称空间tx
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
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
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
(2)开启事务组件
<!--开启事务注解-->
<tx:annotation-driven transaction-manager="tranctionmanager"></tx:annotation-driven>
3.在service类上面(获取service类里面方法上面)添加事务注解
(1) @Transactional, 这个注解添加到类上面,也可以添加方法上面
(2)如果把这个注解添加类上面,这个类里面所有的方法都添加事务
(3)如果把这个注解添加方法上面,为这个方法添加事务。
声明式事务管理参数配置
1.在service类上面添加注解@Transactional,在这个注解里面可以配置事务相关参数
2.propagation:事务传播行为
多事务方法(对数据库表数据进行变化的操作)直接进行调用,这个过程中事务是如何进行管理的
3.isolation:事务隔离机制
(1)事务有特性成为隔离性,多事务操作之间不会产生影响
(2)有三个读问题:脏读、不可重复读(一个未提交事务读取到另一提交事务修改数据)、虚(幻)读(一个未提交事务读取到另一提交事务提交数据).
(3)通过设置事务隔离级别,解决读问题。
默认隔离级别为 REPEATABLE READ.
4.timeout:超出时间
(1)事务需要在一定时间内进行提交,如果不提交进行回滚
(2)默认值是-1,设置时间以秒单位进行计算
5.readOnly:是否只读
(1)读:查询操作,写:添加修改删除操作。
(2) readOnly 默认值false,表示可以查询,可以添加修改删除操作+
(3)设置readOnly值是true, 设置成true之后,只能查询。
6.rollbackFor:回滚
设置出现哪些异常进行事务回滚
7.noRollbackFor:不回滚
事务完全注解开发
创建配置类,使用配置类替代xml配置文件