Spring
目录
一.Spring 是什么?
.
二.Spring 体系结构
三.Spring Hello World 搭建
<!-- spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
1.编写 spring 配置文件
<?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="user" class="...路径"> </bean>
</beans>
2.创建Java项目
Admin类就写简单的私有属性,构造方法,getter,setter方法,写完后,在刚刚创建的spring.xml文件里配置Admin类,如下所示:
<?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">
<!--在spring的配置文件注册需要spring框架管理的类-->
<bean id="admin" class="com.ffyc.springpro.model.Admin"></bean>
</beans>
接下来在Test1类中就要写测试代码了:
package com.ffyc.springpro.test;
import com.ffyc.springpro.model.Admin;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test1 {
public static void main(String[] args) {
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("spring.xml");
Admin admin1 = (Admin) applicationContext.getBean("admin"); //返回类型为object,需强制转换为Admin类型
Admin admin = applicationContext.getBean("admin", Admin.class);//也可在后面加“Admin.class”
System.out.println(admin);
System.out.println(admin1);
}
}
结果如图所示:
四.Spring Bean 管理
1.基于 xml 配置方式
bean:配置需要spring管理的类,id:生成的 对象名 ,class:全类名,name:对象别名,可以为多个scope:singleton(默认值):在Spring中只存在一个bean实例, 单例模式.prototype:原型 getBean()的时候都会 new Bean()request: 每次http请求都会创建一个bean, 仅用于WebApplicationContext环境
Xml 配置方式依赖注入【DI:Dependency Injection】
<!--IOC指的是让spring框架创建对象,创建对象的同时还有一个动作称为依赖注入
依赖注入:在创建对象的时候,为对象中属性赋值
两种方式:-->
<!--scope=“singleton” 单例的 (默认) 在spring框架启动时就创建对象,
而且始终只创建了一个对象,相同的内存地址
scope=“prototype” 原型的(多例的) 在每次获得对象时,
创建一个新的对象 ,不同的内存地址-->
<!--1.通过属性注入,属性的set方法,set方法名必须标准-->
<bean id="admin" class="com.ffyc.springpro.model.Admin" scope="prototype">
<property name="account" value="admin"></property>
<property name="password" value="111"></property>
</bean>
<!--2.构造方法注入,必须要有有参构造方法-->
<bean id="admin" class="com.ffyc.springpro.model.Admin" scope="singleton">
<constructor-arg name="account" value="admin"></constructor-arg>
<constructor-arg name="password" value="111"></constructor-arg>
</bean>
2.注解方式实现
< context :component-scan base-package ="包名" > </ context :component-scan >
注解创建对象:@Component(value=“user”)等同于 <bean id=“user” class=“”></bean>@Service在service包中的类前添加“@Service”,用法与“@Component”相同,在不同的包中名字不同而已@Repository在dao包中的类前添加“@Repository”,用法与“@Component”相同,在不同的包中名字不同而已以上注解都可以实现创建对象功能,只是为了后续扩展功能,在不同的层使用不同的注解标记@Scope(value=“prototype”) 原型@Scope(value=“ singleton ”) 单例
注解方式注入【DI:Dependency Injection】
@Autowired 是 Spring 提供的注解,可以写在字段和 setter 方法上。如果写在字段上,那么就不需要再写 setter 方法。默认情况下它要求依赖对象必须存在,如果允许 null 值,可以设置它的 required 属性为 false。 required() default== true
byType 自动注入:该注解默认使用按类型自动装配 Bean 的方式。
例如:
AdminDao adminDao;
@Autowired通过AdminDao类型可以找到adminDao
byName 自动注入:如果我们想使用 按照名称(byName) 来装配,可以结合 @Qualifier 注解一起使用。@Autowired例如:@Qualifier(value = "adminDao")
需要在引用属性上联合使用注解@Autowired 与@Qualifier。@Qualifier 的 value 属性用于指定要匹配的 Bean 的 id 值。
JDK 注解:
@Resource是java语言提供的注解标签,也是添加在属性上,不需要写set方法
注入的值也是不能为空的。@Resource 自动注入:Spring 提供了对 jdk 中@Resource 注解的支持。@Resource 注解既可以按名称匹配 Bean,也可以按类型匹配 Bean。默认按照 ByName 自动注入例如: @Resource (按类型自动装配)byName 注入引用类型属性@Resource 注解指定其 name 属性,则 name 的值即为按照名称进行匹配的 Bean 的 id。例如: @Resource(name = "adminDao") (按名称自动装配)
3.注解与XML的对比
优点 | 缺点 | |
注解 | 方便,直观,高效(代码少,没有配置文件的书写那么复杂) | 以硬编码的方式写入到 Java 代码中,修改是需要重新编译代码的。 |
xml |
配置和代码是分离的,在 xml 中做修改,无需编译代码,只需重启服务器即可将新的配置加载。
| 编写麻烦,效率低,大型项目过于复杂。 |
五.Spring 数据访问层管理
开发步骤:
下载 Spring jdbc 数据访问层 jar 包
<!-- spring-jdbc -->< dependency >< groupId >org.springframework</ groupId >< artifactId >spring-jdbc</ artifactId > < version >5.2.2.RELEASE</ version ></ dependency >
<!-- 阿里数据源 -->< dependency >< groupId >com.alibaba</ groupId >< artifactId >druid</ artifactId >< version >1.1.10</ version ></ dependency >
<context:property-placeholder location="config.properties"/>
< bean id ="dataSource"class="com.alibaba.druid.pool.DruidDataSource">< property name =" driverClassName " value =""></ property >< property name ="url" value ="" ></ property >< property name ="username" value ="" ></ property >< property name ="password" value ="" ></ property >< property name ="initialSize" value ="10" ></ property ><!--初始化连接数量-->< property name ="maxActive" value ="20" ></ property ><!--最大连接数量--></ bean >
六.Spring 集成 Mybatis
1.导入 mybatis jar 包
< dependency >< groupId >org.mybatis</ groupId >< artifactId >mybatis-spring</ artifactId >< version >1.3.1</ version ></ dependency >
< bean id ="sqlSessionFactory" class ="org.mybatis.spring.SqlSessionFactoryBean" >< property name ="dataSource" ref ="dataSource" ></ property >< property name ="configLocation"value ="classpath:mybatis-config.xml" ></ property >< property name ="mapperLocations" value ="classpath:mappers/*Mapper.xml" ></ property ></ bean >
2.指定生成接口代理
< bean id ="mapperFactory"class ="org.mybatis.spring.mapper.MapperScannerConfigurer" >< property name ="basePackage" value ="com.ffyc.ssm.dao" ></ property >< property name ="sqlSessionFactoryBeanName" value ="sqlSessionFactory" ></ property ></ bean >
3.注入 Dao 代理接口
七.AOP
1.AOP 概述
AOP 为 Aspect Oriented Programming 的缩写,意为: 面向切面编程 ,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。
AOP 是 OOP (面向对象过程)的延续,是软件开发中的一个热点,是 java 开发中的一个重要内容。利用 AOP 可以对 业务逻辑 和 非业务逻辑 进行隔离,从而使得各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
2.AOP 的基本概念
连接点(Joinpoint) |
类中可以被增强的方法,这个方法就被称为连接点
|
切入点(pointcut) |
类中有很多方法可以被增强,但实际中只有 add 和 update
被增了,那么 add 和 update 方法就被称为切入点(实际实现的连接点)
|
通知(Advice) |
通知是指一个切面在特定的连接点要做的事情(增强的功能)。通
知分为方法执行前通知,方法执行后通知,环绕通知等.
|
目标(Target) | 代理的目标对象(连接点,切入点所在类) |
代理(Proxy) | 向目标对象应用通知时创建的代理对象 |
3.springAOP 实现
< dependency >< groupId >org.springframework</ groupId >< artifactId >spring-aspects</ artifactId >< version >5.2.2.RELEASE</ version ></ dependency >
@Before 前置通知 | 方法执行之前 |
@After 后置通知 | 方法执行之后,无论是否出现异常 |
@AfterReturnning 返回通知 | 方法成功执行之后通知,出现异常不执行 |
@AfterThrowing 异常通知 | 抛出异常之后通知 |
@Around 环绕通知 | 方法执行前后都有通知 可以在业务方法执行之前,之后,出现异常时添加功能 |
package com.ffyc.springpro.common;
import com.alibaba.druid.support.json.JSONUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
import java.util.Arrays;
@Component /*spring扫描*/
//用来定义一个 切面(Aspect)
@Aspect
public class CommonUtil {
/*通知,向连接点添加的功能*/
/*@Before 前置通知 在业务方法执行之前调用执行 */
/*@After 后置通知 在业务方法执行之后调用执行 即使业务代码出现异常,也会执行 但后面的方法不会执行*/
/*@AfterReturning 返回通知 在业务方法执行之后调用执行 当业务代码有异常 不会执行 */
/*@AfterThrowing 异常通知 在业务方法出现异常时执行 */
//@Before("execution(* com.ffyc.springpro.dao.AdminDao.*(..))")
//@After("execution(* com.ffyc.springpro.dao.AdminDao.*(..))")
/* @AfterReturning("execution(* com.ffyc.springpro.dao.AdminDao.*(..))")
public void commit(){
System.out.println("提交事务");
}*/
//@AfterThrowing(value = "execution(* com.ffyc.springpro.dao.AdminDao.*(..))",throwing = "throwable")
public void exception(Throwable throwable){
System.out.println("系挺忙"+throwable.getMessage());
throwable.getStackTrace();
}
public void printLog(){
System.out.println("打印日志");
}
/*
@Around 环绕通知 可以在业务方法执行之前,之后,出现异常时添加功能
ProceedingJoinPoint joinPoint表示的是目标方法
*/
@Around(value = "execution(* com.ffyc.springpro.dao.AdminDao.*(..))")
public void aroud(ProceedingJoinPoint joinPoint){
System.out.println("前置通知");
try {
Object[] objects = joinPoint.getArgs(); //获取到我们目标方法的参数
System.out.println(Arrays.toString(objects));
Object object = joinPoint.proceed(); //调用目标业务方法
System.out.println("返回通知");
} catch (Throwable e) {
e.printStackTrace();
System.out.println("异常通知");
}
System.out.println("后置通知");
}
}
八.Spring 事物管理
1.数据库事务管理
2.spring 事务管理
编程式事务在项目中很少使用,这种方式需要在我们代码中需要提交事务或回滚事务时自己写代码实现.
声明式事务管理建立在 AOP 基础上,本质是对方法前后进行拦截,所以声明式事务是 方法 级别的。
基于注解实现的 spring 事务管理
Spring 框架,提供事物管理实现类是 DataSourceTransactionManager .
<!-- 配置 spring 事务管理器-->< bean id ="transactionManager"class ="org.springframework.jdbc.datasource.DataSourceTransactionManager" >< property name ="dataSource" ref ="dataSource" ></ property ></ bean >
<!-- 开启注解事务管理 -->< tx :annotation-driven transaction-manager ="transactionManager" />
出现异常时,可以使用@Transactional(rollbackFor = Exception.class),表示的是回滚事务,要么全部执行成功,要么全部不执行。
mysql目前只有InnoDB引擎支持事务
今天的分享就到这里,如有错误,还望私信指出,制作不易,看完记得一键三连哦!!!
原文地址:https://blog.csdn.net/2303_77640525/article/details/142145554
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!