Spring
2020-10-16 09:31:56 25 举报
AI智能生成
Spring自学个人总结,不是很好!
作者其他创作
大纲/内容
简单使用
导入maven依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
创建applicationContext.xml上下文配置文件
创建测试用例
测试
bean的作用域
singleton (默认):单例模式
将每个 Spring IoC 容器的单个 bean 定义范围限定为单个对象实例
<bean id="accountService" class="com.something.DefaultAccountService" scope="singleton"/>
prototype :原型模式
将单个 bean 定义的作用域限定为任意数量的对象实例
<bean id="accountService" class="com.something.DefaultAccountService" scope="prototype"/>
request
session
application
websocket
bean的自动装配
自动装配是spring满足bean依赖的一种方式
spring会在上下文中寻找,并给bean自动装配属性
spring的装配方式
XML中的显示装配
Java中的显示装配
隐式的自动装配
自动装配的四种模式
默认模式(无自动装配)
byName
Spring 寻找与需要自动装配的属性同名的 bean
保证id唯一
byType
如果容器中恰好存在一个该属性类型的 bean,则使该属性自动装配
保证class唯一
constructor
类似于byType,但适用于构造函数参数
注解实现自动装配
导入约束
开启注解支持:
<context:annotation-config/>
添加注解
@Autowired
用于对 Bean 的属性变量、属性的 Set 方法及构造函数进行标注,
配合对应的注解处理器完成 Bean 的自动配置工作,
默认按照 Bean 的类型进行装配
配合对应的注解处理器完成 Bean 的自动配置工作,
默认按照 Bean 的类型进行装配
@Qualifier
与 @Autowired 注解配合使用,会将默认的按 Bean 类型装配修改为按 Bean 的实例名称装配,
Bean 的实例名称由 @Qualifier 注解的参数指定。
Bean 的实例名称由 @Qualifier 注解的参数指定。
@Resources
作用和@Autowired相同
JavaConfig配置
使用注解@configuration
@Configuration
public class AppConfig {
@Bean
public MyService myService() {
return new MyServiceImpl();
}
}
public class AppConfig {
@Bean
public MyService myService() {
return new MyServiceImpl();
}
}
方法名相当于id属性
等同于:
<beans>
<bean id="myService" class="com.acme.services.MyServiceImpl"/>
</beans>
<beans>
<bean id="myService" class="com.acme.services.MyServiceImpl"/>
</beans>
整合mybatis
实现方式一:
在Spring配置文件中配置数据库的数据源,代替mybatis中的配置
class="org.springframework.jdbc.datasource.DriverManagerDataSource"
将SqlSessionFactory注册到Spring容器中
class="org.mybatis.spring.SqlSessionFactoryBean"
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<property name="mapperLocations" value="classpath:com/kuang/dao/*.xml"
将SqlSession注册到Spring容器中
编写DAO接口的实现类,并注册到Spring容器中
描述
Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器(框架)
优点
Spring是一个开源免费的框架 , 容器
Spring是一个轻量级的框架 , 非侵入式的
控制反转 IoC , 面向切面 Aop
Spring的核心模块
Spring 框架是一个分层架构,由 7 个定义良好的模块组成
核心容器
核心容器提供 Spring 框架的基本功能
核心容器的主要组件是BeanFactory
Spring上下文
SpringAOP
SpringDAO
SpringORM
SpringWEB模块
SpringMVC
IOC
制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法
控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。
在Spring中实现控制反转的是IoC容器,其实现方法是依赖注入(Dependency Injection,DI)
在Spring中实现控制反转的是IoC容器,其实现方法是依赖注入(Dependency Injection,DI)
依赖注入(DI)
子主题
构造器注入
默认无参构造
有参构造
set注入
引用类型注入
<property name="address" ref="address"/>
字符串注入
<property name="name" value="cairui"/>
数组注入
<property name="books">
<array>
<value>《西游记》</value>
<value>《红楼梦》</value>
</array>
</property>
List
<property name="hoppies">
<list>
<value>篮球</value>
<value>看书</value>
<value>学Java</value>
</list>
</property>
Set
<property name="games">
<set>
<value>DNF</value>
<value>LOL</value>
<value>亡者农药</value>
</set>
</property>
Map
<property name="card">
<map>
<entry key="java" value="从入门到摔门"/>
<entry key="c" value="从门到入坟"/>
<entry key="mysql" value="从删库到跑路"/>
</map>
</property>
Properties
<property name="props">
<props>
<prop key="武当">张三丰</prop>
<prop key="明教">张无忌</prop>
<prop key="峨眉">周芷若</prop>
</props>
</property>
<props>
<prop key="武当">张三丰</prop>
<prop key="明教">张无忌</prop>
<prop key="峨眉">周芷若</prop>
</props>
</property>
null
<property name="wife">
<null/>
</property>
扩展注入
p命名空间
xmlns:p="http://www.springframework.org/schema/p"
c命名空间
xmlns:c="http://www.springframework.org/schema/c"
注解开发
环境搭建
导入AOPmaven依赖
在核心配置文件中导入context约束,增加注解支持
Bean
@Component
可以使用此注解描述 Spring 中的 Bean,但它是一个泛化的概念,仅仅表示一个组件(Bean),
并且可以作用在任何层次。使用时只需将该注解标注在相应类上即可。
并且可以作用在任何层次。使用时只需将该注解标注在相应类上即可。
等同于:<bean id="user" class="com.cairui.entity.User"/>
属性注入
@Value("值")
给属性赋值
等同于:<property name="name" value="name"/>
衍生注解
@Component的衍生注解,与@Component的功能相同
dao层
@Repository
用于将数据访问层(DAO层)的类标识为 Spring 中的 Bean,其功能与 @Component 相同
service层
@Service
通常作用在业务层(Service 层),用于将业务层的类标识为 Spring 中的 Bean,其功能与 @Component 相同
controller层
@Controller
通常作用在控制层(如 Struts2 的 Action),用于将控制层的类标识为 Spring 中的 Bean,其功能与 @Component 相同
自动装配
@Autowired
默认通过类型进行自动装配
如果自动装配的属性不是唯一,可以通过@Qualifier(Value="xxx")来指定
@Resources
通过name进行自动装配
@Resource 中有两个重要属性:name 和 type
AOP
面向切面编程
在预编译和运行期,通过动态代理方式,在不修改程序代码情况下,实现程序功能的扩展
好处:
降低业务逻辑各个部分耦合性
提高了代码的复用性
提高开发效率
相关概念
Aspect(切面)
Joint Point(连接点)
Pointcut(切点)
Advice(增强)
前置通知(before):在执行业务代码前做些操作,比如获取连接对象
后置通知(after):在执行业务代码后做些操作,无论是否发生异常,它都会执行,比如关闭连接对象
异常通知(afterThrowing):在执行业务代码后出现异常,需要做的操作,比如回滚事务
返回通知(afterReturning),在执行业务代码后无异常,会执行的操作
环绕通知(around),在执行业务代码前后执行操作
target(目标对象)
weaving(织入)
实现
导入maven依赖
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.4</version>
</dependency>
实现方式一:使用SpringAPI实现
编写业务接口和实现类:
业务接口:
public interface UserService{
public void delete();
}
public interface UserService{
public void delete();
}
实现类:
public class UserServiceImpl implements{
public void delete(){
......
}
}
public class UserServiceImpl implements{
public void delete(){
......
}
}
编写增强类,通过实现Spring接口创建增强类
前置增强类:
public class Log 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() + "方法被执行了");
}
}
public class Log 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() + "方法被执行了");
}
}
后置返回增强类:
public class AfterLog implements AfterReturningAdvice {
//returnValue 返回值
//method被调用的方法
//args 被调用的方法的对象的参数
//target 被调用的目标对象
@Override
public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
System.out.println("执行了" + target.getClass().getName()
+"的"+method.getName()+"方法,"
+"返回值:"+returnValue);
}
}
public class AfterLog implements AfterReturningAdvice {
//returnValue 返回值
//method被调用的方法
//args 被调用的方法的对象的参数
//target 被调用的目标对象
@Override
public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
System.out.println("执行了" + target.getClass().getName()
+"的"+method.getName()+"方法,"
+"返回值:"+returnValue);
}
}
在Spring配置文件中注册:
导入约束
xmlns:aop="http://www.springframework.org/schema/aop"
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
AOP配置
<aop:config>
<!--切入点 expression:表达式匹配要执行的方法-->
<aop:pointcut id="pointcut" expression="execution(* com.cairui.service.UserServiceImpl.*(..))"/>
<!--执行环绕; advice-ref执行方法 . pointcut-ref切入点-->
<aop:advisor advice-ref="log" pointcut-ref="pointcut"/>
<aop:advisor advice-ref="afterLog" pointcut-ref="pointcut"/>
</aop:config>
<!--切入点 expression:表达式匹配要执行的方法-->
<aop:pointcut id="pointcut" expression="execution(* com.cairui.service.UserServiceImpl.*(..))"/>
<!--执行环绕; advice-ref执行方法 . pointcut-ref切入点-->
<aop:advisor advice-ref="log" pointcut-ref="pointcut"/>
<aop:advisor advice-ref="afterLog" pointcut-ref="pointcut"/>
</aop:config>
测试
实现方式二:自定义类实现AOP
自定义切入类
public class DiyPointcut {
public void before(){
System.out.println("---------方法执行前---------");
}
public void after(){
System.out.println("---------方法执行后---------");
}
}
public void before(){
System.out.println("---------方法执行前---------");
}
public void after(){
System.out.println("---------方法执行后---------");
}
}
在Spring配置文件中注册
注册bean
<bean id="diy" class="com.cairui.config.DiyPointcut"/>
配置AOP
<aop:config>
<!--第二种方式:使用AOP的标签实现-->
<aop:aspect ref="diy">
<aop:pointcut id="diyPonitcut" expression="execution(* com.cairui.service.UserServiceImpl.*(..))"/>
<aop:before pointcut-ref="diyPonitcut" method="before"/>
<aop:after pointcut-ref="diyPonitcut" method="after"/>
</aop:aspect>
</aop:config>
<!--第二种方式:使用AOP的标签实现-->
<aop:aspect ref="diy">
<aop:pointcut id="diyPonitcut" expression="execution(* com.cairui.service.UserServiceImpl.*(..))"/>
<aop:before pointcut-ref="diyPonitcut" method="before"/>
<aop:after pointcut-ref="diyPonitcut" method="after"/>
</aop:aspect>
</aop:config>
方式三:注解实现
编写注解实现的增强类
@Aspect
public class AnnotationPointcut {
@Before("execution(* com.kuang.service.UserServiceImpl.*(..))")
public void before(){
System.out.println("---------方法执行前---------");
}
}
public class AnnotationPointcut {
@Before("execution(* com.kuang.service.UserServiceImpl.*(..))")
public void before(){
System.out.println("---------方法执行前---------");
}
}
注册bean
将增强类注册到容器中
开启注解支持
<aop:aspectj-autoproxy/>
0 条评论
下一页