SSM框架---Spring
2021-03-31 22:53:32 27 举报
AI智能生成
请大家不要直接克隆,着手梳理一遍才会变成自己的知识
作者其他创作
大纲/内容
背景知识
前身
interface21
2002年发布
作者
Jod Johnson
音乐学博士
spring的理念
简化企业级开发,整合现有技术框架
Spring是什么
Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架
为什么要使用Spring
1、方便解耦
2、支持aop编程
3、支持事务处理
4、可以集成各种优秀框架
Spring配置
Bean的配置
<bean id="user" class="com.learning.pojo.User" name="user1 user2,user3;user4">
id代表名字
class绑定pojo类,需要全限定名
name是起别名用的,分隔符可以是空格、逗号、分号
import
一般用于团队开发
别名(Bean的name也可以取别名)
别名和原名都可以取到对象
<alias name="user" alias="user2"/>
控制反转IOC
它是一种思想
把程序运行的决定权从程序员手中交给用户
优点
⭐解耦!
核心
工厂模式
IOC创建对象的时间
⭐在把bean注册到bean.xml的时候就已经初始化对象了,而不是在使用时才初始化
IOC创建对象的方式
1、使用无参构造函数创建(默认)
<bean id="user" class="com.learning.pojo.User">
<property name="username" value="Spring"/>
</bean>
<property name="username" value="Spring"/>
</bean>
property可以为对象设置属性值
2、有参构造函数创建
1、下标赋值创建
<bean id="user" class="com.learning.pojo.User">
<constructor-arg index="0" value="1"/>
<constructor-arg index="1" value="root"/>
<constructor-arg index="2" value="123456"/>
</bean>
<constructor-arg index="0" value="1"/>
<constructor-arg index="1" value="root"/>
<constructor-arg index="2" value="123456"/>
</bean>
2、通过类型创建(不能解决重复参数类型属性,所以不推荐)
<bean id="user" class="com.learning.pojo.User">
<constructor-arg type="java.lang。int" value="1"/>
<constructor-arg type="java.lang.String" value="root"/>
⭐<constructor-arg type="java.lang.String" value="123456"/>⭐
</bean>
<constructor-arg type="java.lang。int" value="1"/>
<constructor-arg type="java.lang.String" value="root"/>
⭐<constructor-arg type="java.lang.String" value="123456"/>⭐
</bean>
3、直接通过参数名创建
<bean id="user" class="com.learning.pojo.User">
<constructor-arg name="id" value="1"/>
<constructor-arg name="username" value="root"/>
<constructor-arg name="password" value="123456"/>
</bean>
<constructor-arg name="id" value="1"/>
<constructor-arg name="username" value="root"/>
<constructor-arg name="password" value="123456"/>
</bean>
实现方式
1、通过xml配置
1、在beans.xml中添加bean标签
<bean id="user" class="com.learning.pojo.User">
<property name="username" value="Spring"/>
</bean>
<property name="username" value="Spring"/>
</bean>
普通创建方式
User user = new User();
SpringIOC方式
id就是getBean方法的参数,class绑定pojo类,property设置对象属性
2、在需要使用类的地方通过ClassPathXMLApplicationContext获取
//获取Spring的上下文对象
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
//我们的对象都在Spring的管理中了,我们只需要从里面取出来用就可以了
Object user = context.getBean("user");
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
//我们的对象都在Spring的管理中了,我们只需要从里面取出来用就可以了
Object user = context.getBean("user");
2、通过注解实现
实现结果
对象由Spring创建、管理、装配
DI依赖注入
1、构造器注入
2、set注入⭐
普通类型
<property name="username" value="徐虎"/>
Bean注入
<property name="address" ref="address"/>
数组
<property name="relation">
<array>
<value>爸爸</value>
<value>妈妈</value>
<value>妹妹</value>
</array>
</property>
<array>
<value>爸爸</value>
<value>妈妈</value>
<value>妹妹</value>
</array>
</property>
list
<property name="hobbies">
<list>
<value>听歌</value>
<value>敲代码</value>
<value>看电影</value>
</list>
</property>
<list>
<value>听歌</value>
<value>敲代码</value>
<value>看电影</value>
</list>
</property>
Map
<property name="card">
<map>
<entry key="一卡通" value="20181004116"></entry>
</map>
</property>
<map>
<entry key="一卡通" value="20181004116"></entry>
</map>
</property>
Set
<property name="games">
<set>
<value>王者荣耀</value>
</set>
</property>
<set>
<value>王者荣耀</value>
</set>
</property>
⭐null空值(不是空串)
<property name="wife">
<null></null>
</property>
<null></null>
</property>
Properties
<property name="info">
<props>
<prop key="学号">20181004116</prop>
<prop key="专业">软件工程</prop>
</props>
</property>
<props>
<prop key="学号">20181004116</prop>
<prop key="专业">软件工程</prop>
</props>
</property>
值必须写在prop标签中间
3、扩展注入方式
p命名空间
直接注入属性值
p:XXX = ""
c命名空间
通过构造器注入属性值
c:XXX = ""
4、Bean Scopes(Bean作用域)
singleton(默认)
单例模式
prototype
原型模式
每次getBean()都是一个新对象
session
web中使用
request
web中使用
配置方式
<bean id="" class="" scope="session/prototype/session/request">
Bean的自动装配
三种装配方式
1、xml装配
2、java中装配
3、隐式的自动装配⭐
自动装配
1、ByName
<bean id="" class="" autowire="byName">
被自动装配bean的id必须是set后面的值
2、ByType
<bean id="" class="" autowire="byType">
被装配的bean只能被注册一次
3、注解装配⭐
@autowired
ByName方式装配
可以使用 @Qualifier(value = "XXX")配合
@Resource
先ByName,再ByType
配置
1、xmlns:context="http://www.springframework.org/schema/context"
2、<context : annotation-config/>
3、xsi:schemaLocation添加http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/context/spring-context.xsd
使用注解开发
步骤
1、导入aop包
2、application.xml(beans.xml)中配置扫描路径
<context:component-scan base-package="com.learning.pojo"/>
3、在类名上增加@Component注解
等价于<bean id="user" class="com.learning.pojo.User" />
4、在属性或者属性对应的set方法上增加@Value注解
@Value("小明")
注解
把类注册到Spring容器中,装配bean
pojo
@Component
mapper
@Repository
service
@Service
controller
@Controller
作用域注解
@Scope
最佳实践
xml用来注册bean
@Value注解注入属性值
⭐注意
注解生效必须扫描对应的包
<context:component-scan base-package="com.learning.pojo"/>
<context:annotation-config/>
<context:annotation-config/>
使用Java的方式配置Spring
1、创建Config包、类
2、添加@Configuration注解
@Configuration本质也是一个component组件,这个配置类也会被Spring接管
3、添加@ComponentScan("com.learning.pojo")注解扫描包
4、在pojo实体类中添加@Component注解,把对象交给Spring管理
5、在配置类里面写实体类的方法,这里的函数名就是bean的id,添加@Bean注解
@Bean
public User user(){
return new User();
}
代理模式
静态代理
优点
1、解耦
2、方便业务管理
缺点
1、代码量大(一个被代理类就需要一个代理类)
动态代理
本质
反射机制
代理的对象
代理的是接口
两大类
基于接口的动态代理
JDK动态代理
基于类的动态代理
Java字节码实现动态代理
两个类
Prxy
invocationHandler
面向切面编程AOP
核心
代理模式
三种方式
1、原生API实现
<aop:config>
<!--设置切入点-->
<aop:pointcut id="pointOne" expression="execution(* com.learning.service.UserServiceImpl.*(..))"/>
<!--执行环绕增强-->
<aop:advisor advice-ref="logBefore" pointcut-ref="pointOne"/>
<aop:advisor advice-ref="logAfter" pointcut-ref="pointOne"/>
</aop:config>
2、使用定义类实现
<aop:config>
<aop:aspect ref="myPointCut">
<aop:pointcut id="pointOne" expression="execution(* com.learning.service.UserServiceImpl.*(..))"/>
<aop:before method="before" pointcut-ref="pointOne"/>
<aop:after method="after" pointcut-ref="pointOne"/>
</aop:aspect>
</aop:config>
3、注解实现
切面类
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
@Aspect
public class AnnotationPointCut {
@Before("execution(* com.learning.service.UserServiceImpl.*(..))")
public void before(){
System.out.println("========before=========");
}
@After("execution(* com.learning.service.UserServiceImpl.*(..))")
public void after(){
System.out.println("========after=========");
}
}
ApplicationContext.xml
<!--注册bean-->
<bean id="annocationPointCut" class="com.learning.diy.AnnotationPointCut"/>
<!--开启注解支持-->
<aop:aspectj-autoproxy/>
整合Mybatis
1、导入依赖
junit测试
mysql
mybatis
spring
spring-jdbc
aspectjweaver
mybatis-spring
2、环境准备
1、编写dataResource数据源
<!--DataSource:使用Spring的数据源替换Mybatis的配置 c3p0 dbcp druid
我们这里使用Spring提供的JDBC:org.springframework.jdbc.datasource.DriverManagerDataSource
-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=false&useUnicode=true&characterEncoding=utf-8&SetTimezone=CTT"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
2、注册SqlSessionFactory
<!--SqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!--绑定Mybatis配置-->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<property name="mapperLocations" value="classpath:com/learning/mapper/*.xml"/>
</bean>
3、注册SqlSessionTemplate
<!--SqlSessionTemplate:就是我们使用的SqlSession-->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<!--SqlSessionTemplate没有set方法,只能通过构造函数注入参数-->
<constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>
4、把实现的mapper注册进spring
<bean id="userMapper" class="com.learning.mapper.UserMapperImpl">
<property name="sqlSession" ref="sqlSession"/>
</bean>
3、测试
1、使用set绑定SqlSession
<!--绑定SqlSession-->
<bean id="userMapper" class="com.learning.mapper.UserMapperImpl">
<property name="sqlSession" ref="sqlSession"/>
</bean>
package com.learning.mapper;
import com.learning.pojo.User;
import org.mybatis.spring.SqlSessionTemplate;
import java.util.List;
public class UserMapperImpl implements UserMapper{
//之前所有用SqlSession的地方都改成SqlSessionTemplate
private SqlSessionTemplate sqlSession;
public void setSqlSession(SqlSessionTemplate sqlSession) {
this.sqlSession = sqlSession;
}
public List<User> getAllUser() {
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
return mapper.getAllUser();
}
}
2、继承SqlSessionDaoSupport
<!--绑定sqlSessionFactory-->
<bean id="userMapper2" class="com.learning.mapper.UserMapperImpl2">
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
package com.learning.mapper;
import com.learning.pojo.User;
import org.mybatis.spring.support.SqlSessionDaoSupport;
import java.util.List;
public class UserMapperImpl2 extends SqlSessionDaoSupport implements UserMapper {
public List<User> getAllUser() {
return getSqlSession().getMapper(UserMapper.class).getAllUser();
}
}
声明式事务
1、回顾事务
特点
一组业务要么都成功、要么都失败
效果
保护数据一致性
ACID原则
原子性
一致性
隔离性
持久性
2、使用
<!--配置声明式事务-->
<bean id="transationManage" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource " ref="dataSource"/>
</bean>
<!--结合AOP注入-->
<!--配置事务通知-->
<tx:advice id="txAdvice" transaction-manager="transationManage">
<tx:attributes>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<!--配置事务切入-->
<aop:config>
<aop:pointcut id="txPointCut" expression="execution(* com.learning.mapper.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"/>
</aop:config>
0 条评论
下一页