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\t(默认):单例模式
将每个 Spring IoC 容器的单个 bean 定义范围限定为单个对象实例
<bean id=\"accountService\" class=\"com.something.DefaultAccountService\" scope=\"singleton\"/>
prototype\t :原型模式
将单个 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 的类型进行装配
@Qualifier
与 @Autowired 注解配合使用,会将默认的按 Bean 类型装配修改为按 Bean 的实例名称装配,Bean 的实例名称由 @Qualifier 注解的参数指定。
@Resources
作用和@Autowired相同
JavaConfig配置
使用注解@configuration
@Configurationpublic class AppConfig {@Bean public MyService myService() { return new MyServiceImpl(); }}
方法名相当于id属性
等同于:<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
描述
Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器(框架)
优点
Spring的核心模块
Spring 框架是一个分层架构,由 7 个定义良好的模块组成
核心容器
核心容器提供 Spring 框架的基本功能
核心容器的主要组件是BeanFactory
Spring上下文
SpringAOP
SpringDAO
SpringORM
SpringWEB模块
SpringMVC
IOC
制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法
依赖注入(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>
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 相同
自动装配
默认通过类型进行自动装配
如果自动装配的属性不是唯一,可以通过@Qualifier(Value=\"xxx\")来指定
通过name进行自动装配
@Resource 中有两个重要属性:name 和 type
AOP
面向切面编程
在预编译和运行期,通过动态代理方式,在不修改程序代码情况下,实现程序功能的扩展
好处:
降低业务逻辑各个部分耦合性
提高了代码的复用性
提高开发效率
相关概念
Aspect(切面)
Joint Point(连接点)
Pointcut(切点)
Advice(增强)
前置通知(before):在执行业务代码前做些操作,比如获取连接对象
后置通知(after):在执行业务代码后做些操作,无论是否发生异常,它都会执行,比如关闭连接对象
异常通知(afterThrowing):在执行业务代码后出现异常,需要做的操作,比如回滚事务
环绕通知(around),在执行业务代码前后执行操作
target(目标对象)
weaving(织入)
实现
<!-- 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 class UserServiceImpl implements{public void delete(){......}}
编写增强类,通过实现Spring接口创建增强类
在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>
实现方式二:自定义类实现AOP
自定义切入类
public class DiyPointcut { 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>
方式三:注解实现
编写注解实现的增强类
@Aspectpublic class AnnotationPointcut { @Before(\"execution(* com.kuang.service.UserServiceImpl.*(..))\") public void before(){ System.out.println(\"---------方法执行前---------\"); }}
将增强类注册到容器中
开启注解支持
<aop:aspectj-autoproxy/>
0 条评论
回复 删除
下一页