Spring

  • 轻量级、非侵入式的框架
  • 支持控制反转(IOC)、面向切面编程(AOP)
  • 支持事务的处理和声明、框架整合

1.HelloSpring(入门)

1.1导入依赖
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.3</version>
</dependency>
1.2xml配置
<?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初始化的类-->
...
</beans>
1.3导入类
@Data
public class Student {
private int id;
private String name;
}//新建一个类接口
<!--向spring声明需要实例化的类及其初始化属性-->
<!--通过无参构造和set函数实例化-->
<bean id="Student" class="Student">
<property name="id" value="2018117"></property>
<property name="name" value="LIHONG"></property>
</bean>
1.4获得该类对象
public class MyTest {
public static void main(String[] args) {
//
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");//获取spring上下文
Student student = (Student)context.getBean("Student");//用bean的id获取该实例
System.out.println(student.toString());
}
}

2.基本配置

2.1 别名 alias
<!--为一个bean对象起个别名-->
<alias name="Student1" alias="ss1"></alias>
2.2 实例对象 bean
<bean id="bean对象的名称" class="bean对象的实体类" name="别名 别名,别名;别名" >
</bean>

3.依赖注入

3.1 set注入
<bean id="" class="">
<property name="普通类型注入" value="普通类型值"/>
<property name="Bean类型注入" ref="bean类型的id"/>
<property name="数组类型注入" >
<array>
<value>...</value>
<value>...</value>
</array>
</property>
<property name="List类型注入" >
<list>
<value>...</value>
<value>...</value>
</list>
</property>
<property name="Map类型注入" >
<map>
<entry key="" value=""/>
<entry key="" value=""/>
</map>
</property>
<property name="properties类型注入" >
<props>
<entry key="">value</entry>
<entry key="">value</entry>
</props>
</property>
</bean>
3.2 构造器注入
<!--通过有参构造的参数下标实例化-->
<bean id="Student2" class="Student">
<constructor-arg index="0" value="2018118"></constructor-arg>
<constructor-arg index="1" value="qinjiang"></constructor-arg>
</bean>
<!--通过有参构造的参数类型实例化-->
<bean id="Student3" class="Student">
<constructor-arg type="int" value="2018118"></constructor-arg>
<constructor-arg type="java.lang.String" value="tianle"></constructor-arg>
</bean>
<!--通过有参构造的参数名称实例化-->
<bean id="Student4" class="Student">
<constructor-arg name="id" value="2018118"></constructor-arg>
<constructor-arg name="name" value="tianle"></constructor-arg>
</bean>
3.3 其他注入
3.3.1 p命名空间注入

使用前需要加入p命名空间的配置依赖

xmlns:p="http://www.springframework.org/schema/p"
<!--可以在bean的属性列注入对象属性,实质上通过无参构造和setter-->
<bean id="Student2" class="Student" p:id="" p:name=""/>
3.3.1 c命名空间注入

使用前需要加c命名空间的配置依赖

xmlns:c="http://www.springframework.org/schema/c"
<!--可以在bean的属性列注入对象属性,实质上通过有参构造-->
<bean id="Student2" class="Student" c:id="" c:name=""/>

4.Bean的作用域和自动装配

4.1Spring中Bean的几种装配方式
  • XML显式装配
  • Java显式装配
  • 隐式自动装配
4.2 ByName自动装配

当一个bean节点带有 autowire byName的属性时。

  1. 将查找其类中所有的set方法名,例如setCat,获得将set去掉并且首字母小写的字符串,即cat。
  2. 去spring容器中寻找是否有此字符串名称id的对象。
  3. 如果有,就取出注入;如果没有,就报空指针异常。
<bean id="student" class="Student" autowire="byName">
<property name="name" value="lihong"/>
</bean>
4.3 ByTpye自动装配

使用autowire byType首先需要保证:同一类型的对象,在spring容器中唯一。如果不唯一,会报不唯一的异常。

<bean id="user" class="com.kuang.pojo.User" autowire="byType">
<property name="str" value="qinjiang"/>
</bean>
4.4 注解实现自动装配

使用前需要加注解的配置依赖

xmlns:context="http://www.springframework.org/schema/context"
<!--添加到schemaLocation目录中-->
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
<!--开启属性注解支持-->
<context:annotation-config/>

4.4.1 @Autowired

  • @Autowired默认按类型自动转配,不支持id匹配

  • 需要导入 spring-aop的包

    xmlns:aop="http://www.springframework.org/schema/aop"
    <!--添加到schemaLocation目录中-->
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop.xsd
  • 如果允许对象为null,设置required = false,默认为true

    @Autowired(required = false)

4.4.2 @Qualifier

  • @Autowired是根据类型自动装配的,加上@Qualifier则可以根据byName的方式自动装配

  • @Qualifier不能单独使用。

    @Autowired
    @Qualifier(value = "beanId")

4.4.3 @Resource

  • @Resource在指定name属性的情况下,先按该属性进行name方式查找装配 @Resource(name = "beanId")
  • 其次再进行默认的name方式进行装配;
  • 其次按type的方式自动装配。
  • 都不成功,则报异常

5.注解开发和纯Java方式实现Xml配置

5.1注解开发

使用注解开发需要提前做两件预备工作

  • 导入aop包(Spring4之后)
  • 在xml配置中指定扫描包
<context:component-scan base-package="包路径"/>

注解开发方式

@Component("user")// 相当于配置文件中 <bean id="user" class="当前注解的类"/>
@Scope("XXX")//配置Bean的作用域
public class User {
@Value("姬如千泷")//属性注入
public String name;
//@Value("姬如千泷")也可以在构造方法上注入属性
public void setName(String name) {
this.name = name;
}
}
5.2 java方式实现xml配置

JavaConfig 原来是 Spring 的一个子项目,它通过 Java 类的方式提供 Bean 的定义信息,在 Spring4 的版本, JavaConfig 已正式成为 Spring4 的核心功能 。

  • 实体类加组件注解
@Component  //将这个类标注为Spring的一个组件,放到容器中!
public class Dog {
@Value("小黄")
public String name;
}
  • 编写配置类
@Configuration  //代表这是一个配置类
@Import(MyConfig2.class) //导入合并其他配置类,类似于配置文件中的 inculde 标签
public class MyConfig {
@Bean //等价于注册一个bean,这里的返回值类型就是Bean的类型,方法名等价于bean的id
public Dog dog(){
return new Dog();
}
}

6.代理模式

6.1静态代理
  • 抽象角色 : 一般使用接口或者抽象类来实现
  • 真实角色 : 被代理的角色
  • 代理角色 : 代理真实角色 ; 代理真实角色后 , 一般会做一些附属的操作
  • 客户 : 使用代理角色来进行一些操作

静态代理有诸多好处,比如使真实角色的功能更加纯粹,业务分工明显,可扩展性增强等等。但当面对具有大量真实角色的项目时,对每个真实角色都要维护一个代理类,实属麻烦,为此,产生了动态代理。

6.2动态代理
  • 动态代理的代理类是动态生成的 . 静态代理的代理类是我们提前写好的,因此,一个动态代理可以代理多个接口

  • 动态代理分为两类 : 一类是基于接口动态代理 , 一类是基于类的动态代理

    • 基于接口的动态代理----JDK动态代理
    • 基于类的动态代理--cglib
    • 现在用的比较多的是 javasist 来生成动态代理 . 百度一下javasist
    • 我们这里使用JDK的原生代码来实现,其余的道理都是一样的

7.Spring实现AOP(面向切面编程)

使用AOP织入,首先需要导入一个依赖包

<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.4</version>
</dependency>
7.1使用Spring默认api实现
  • 编写一个扩展服务类,前置增强
//实现前置接口
public class BeforeService implements MethodBeforeAdvice {
//method : 要执行的目标对象的方法
//objects : 被调用的方法的参数
//Object : 要通知的目标对象
@Override
public void before(Method method, Object[] objects, Object o) throws Throwable {
System.out.println( o.getClass().getName() + "的" + method.getName() + "方法被执行了");
}
}
  • 在xml中注册服务类和配置aop
<beans>
<bean id="beforeService" class="BeforeService"/>
<!--aop的配置-->
<aop:config>
<!--切入点 expression:表达式匹配要执行的方法,.*(..)代表所有字方法任意参数-->
<aop:pointcut id="pointcut" expression="execution(* 实体类的路径.*(..))"/>
<!--执行环绕; advice-ref执行方法 . pointcut-ref切入点-->
<aop:advisor advice-ref="beforeService" pointcut-ref="pointcut"/>
</aop:config>
</beans>
7.2 自定义类实现
  • 编写一个自己的服务类
public class DiyPointcut {
//自己编写的服务类可以一次性集成多个服务
public void before(){
System.out.println("---------方法执行前---------");
}
public void after(){
System.out.println("---------方法执行后---------");
}
}
  • 在xml中配置服务类和aop
<!--注册bean-->
<bean id="diy" class="com.kuang.config.DiyPointcut"/> <!--aop的配置-->
<aop:config>
<aop:aspect ref="diy">
<aop:pointcut id="diyPonitcut" expression="execution(* 实体类路径.*(..))"/>
<aop:before pointcut-ref="diyPonitcut" method="before"/>
<aop:after pointcut-ref="diyPonitcut" method="after"/>
</aop:aspect>
</aop:config>
7.3 使用注解实现
  • 编写使用注解的服务类
@Aspect
public class AnnotationPointcut {
@Before("execution(* 实体类路径.*(..))")
public void before(){
System.out.println("---------方法执行前---------");
}
  • 在xml中注册bean,并增加支持注解的配置
<bean id="annotationPointcut" class="AnnotationPointcut"/>
<aop:aspectj-autoproxy/>

8.Spring整合Mybatis

除了mybatis(mybatis、mysql-connector-java)和spring(spring-webmvc、spring-jdbc、aspectjweaver)的相关依赖包外,还需导入mybatis-spring依赖包

<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.2</version>
</dependency>
  • 使用spring配置mybatis的数据源
<!--配置数据源:数据源有非常多,可以使用第三方的,也可使使用Spring的-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</bean>
  • 使用spring配置mybatis的SqlSessionFactory
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
</bean>
  • 使用spring创建mybatis的SqlSession对象(使用构造器注入),在Spring中称作一个模板对象SqlSessionTemplate
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory" />
</bean>
  • 与Mybatis不同的是,spring整合需要有一个实现了业务接口的实体类
  • 方式一(自主配置SqlSessionTemplate)
public class UserDaoImpl implements UserDao {
//将SqlSessionTemplate设置为私有属性
private SqlSessionTemplate sqlSession; public void setSqlSession(SqlSessionTemplate sqlSession) {
this.sqlSession = sqlSession;
} public User getUser(String userId) {
return sqlSession.getMapper(UserMapper.class).
}
<!--注册实体类,将注册的SqlSessionTemplate对象丢进去-->
<bean id="userDao" class="com.kuang.dao.UserDaoImpl">
<property name="sqlSession" ref="sqlSession"/>
</bean>
  • 方式二(使用spring提供的方法类SqlSessionDaoSupport)
//该方法类可直接获取到
public class UserDaoImpl extends SqlSessionDaoSupport implements UserMapper {
public List<User> getUser() {
return getSqlSession().getMapper(UserMapper.class).getUser();
}
}
<!--注册实体类,注意这里注入的是sqlSessionFactory对象-->
<bean id="userDao" class="com.kuang.dao.UserDaoImpl">
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>

9.spring事务管理

9.1 编程式事务

一般使用try-catch捕捉并处理,但会修改源代码,不建议使用

9.2声明式事务

将事务管理代码从业务方法中分离出来,以声明的方式来实现事务管理

使用spring管理事务前,需要导入配置约束

xmlns:tx="http://www.springframework.org/schema/tx"

http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
  • 注册事务
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
  • 配置事务
<!--配置事务通知-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!--配置哪些方法使用什么样的事务,配置事务的传播特性-->
<tx:method name="add" propagation="REQUIRED"/>
<tx:method name="delete" propagation="REQUIRED"/>
<tx:method name="update" propagation="REQUIRED"/>
<tx:method name="search*" propagation="REQUIRED"/>
<tx:method name="get" read-only="true"/>
<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
  • aop织入事务
<!--配置aop织入事务-->
<aop:config>
<aop:pointcut id="txPointcut" expression="execution(* 事务实体类包路径.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
</aop:config>

SSM框架——Spring的更多相关文章

  1. 详解intellij idea搭建SSM框架(spring+maven+mybatis+mysql+junit)(下)

    在上一篇(详解intellij idea 搭建SSM框架(spring+maven+mybatis+mysql+junit)(上))博文中已经介绍了关于SSM框架的各种基础配置,(对于SSM配置不熟悉 ...

  2. Maven+SSM框架(Spring+SpringMVC+MyBatis) - Hello World(转发)

    [JSP]Maven+SSM框架(Spring+SpringMVC+MyBatis) - Hello World 来源:http://blog.csdn.net/zhshulin/article/de ...

  3. [JSP]Maven+SSM框架(Spring+SpringMVC+MyBatis) - Hello World

    来源:http://blog.csdn.net/zhshulin/article/details/37956105?utm_source=tuicool&utm_medium=referral ...

  4. SSM框架——Spring+SpringMVC+Mybatis的搭建教程

    一:概述 SSM框架在项目开发中经常使用到,相比于SSH框架,它在仅几年的开发中运用的更加广泛. Spring作为一个轻量级的框架,有很多的拓展功能,最主要的我们一般项目使用的就是IOC和AOP. S ...

  5. 详解intellij idea搭建SSM框架(spring+maven+mybatis+mysql+junit)(上)

    SSM(Spring+SpringMVC+MyBatis)框架集由Spring.SpringMVC.MyBatis三个开源框架整合而成,常作为数据源较简单的web项目的框架. 其中spring是一个轻 ...

  6. Maven 搭建 SSM框架——Spring+SpringMVC+Mybatis的搭建教程

    一:概述 SSM框架在项目开发中经常使用到,相比于SSH框架,它在仅几年的开发中运用的更加广泛. Spring作为一个轻量级的框架,有很多的拓展功能,最主要的我们一般项目使用的就是IOC和AOP.Sp ...

  7. SSM框架——Spring+SpringMVC+Mybatis的搭建

    1.基本概念 1.1.Spring Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One  ...

  8. ssm框架 spring的主配置文件 spring-mvc主配置文件 web.xml配置文件(基础的配置文件)

    1.spring主配置文件 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=" ...

  9. SSM框架—Spring+SpringMVC+MyBatis

    1.环境搭建 1.1概念 Spring是一个Java应用的开源框架,Bean/Context/Core/IOC/AOP/MVC等是其重要组件,IOC控制反转,AOP面向切面编程,各种注入方式,实现方式 ...

  10. SSM框架--Spring+SpringMVC+Mybatis (IDEA)搭建

    使用idea创建一个maven项目( 这里演示 的是 web项目) 点击 Finish 然后开始配置 pom.xml文件(添加各种依赖jar包) 先去找 spring 所需的 jar包 jar包中心仓 ...

随机推荐

  1. 手写编程语言-如何为 GScript 编写标准库

    版本更新 最近 GScript 更新了 v0.0.11 版本,重点更新了: Docker 运行环境 新增了 byte 原始类型 新增了一些字符串标准库 Strings/StringBuilder 数组 ...

  2. CSAPP实验attacklab

    attacklab 实验报告和答案文件都在 https://github.com/thkkk/attacklab

  3. linux 自动备份mysql数据库

    今天一早打开服务器.13W个木马.被爆破成功2次,漏洞3个.数据库被删.这是个悲伤的经历 还好之前有备份,服务器也升级了安全机制,只是备份是上个月的备份.所以想写个脚本,试试自动备份数据库. 1. 先 ...

  4. Linux基础_7_文本显示

    注:实质是针对标准输出文本的各种骚操作! 简单查看 注:初略加工后进行显示. cat -n 文件名 #查看文件内容并显示行号 tac 文件名 #逆序查看 more 文件名 less 文件名 #按?搜索 ...

  5. Mysql入门练习题

    1.在students表中,查询年龄大于25岁,且为男性的同学的名字和年龄 mysql> select name,age from students where age>25 and ge ...

  6. "xxx cannot be cast to jakarta.servlet.Servlet "报错解决方式

    在做jsp的上机时候同学出现了一个500错误:com.kailong.servlet.ComputeBill cannot be cast to jaka.servlet.Servlet 然后因为我用 ...

  7. JAVA代码审计之xss

    java_sec_code xss 补充和回忆一下一些开发基础 @RestController @RequestMapping(value = "/xss") public cla ...

  8. 第一百零八篇:最常用的基本数据类型(Number,String类型)

    好家伙, 1.Number类型 从名称中我们可以得出,这是一个存放数值的类型, 不同的数值类型相应地也有不同的数值字面量格式 number类型可以储存不同进制的数(不常用就是了) 八进制:在数前加一个 ...

  9. 2022春每日一题:Day 19

    题目:吃奶酪 状压dp实现,dp[i][j]表示走过状态i,停到了j的位置的最小价值.枚举状态,起点终点,转移dp[i][j]=min{dp[i-(1<<s)][k]+dis(s,k)} ...

  10. Pinely Round 1 (Div. 1 + Div. 2)

    比赛链接 A 题意 构造两个长为 \(n\) 排列,使得两排列有长为 \(a\) 公共前缀和长为 \(b\) 的公共后缀. 题解 知识点:构造. 注意到,当 \(a+b\leq n-2\) 时,中间段 ...