Spring学习笔记
2021-04-03 22:01:40 1 举报
AI智能生成
用于Spring学习的思维导图笔记。
作者其他创作
大纲/内容
IoC(反转控制)
Inverse Of Control
降低程序间的耦合(依赖关系)
Map结构
Inverse Of Control
降低程序间的耦合(依赖关系)
Map结构
ApplicationContext三个常用实现类
ClassPathXmlApplicationContext
他可以加载类路径下的配置文件,要求配置文件必须在类路径下
他可以加载类路径下的配置文件,要求配置文件必须在类路径下
FileSystemXmlApplicationContext
他可以加载磁盘任意路径下的配置文件(必须有访问权限)不常用
他可以加载磁盘任意路径下的配置文件(必须有访问权限)不常用
AnnotationConfigApplicationContext
用于读取注解创建容器
用于读取注解创建容器
bean对象生命周期
单例对象
出生:容器创建时1
活着:容器存在时
死亡:容器销毁时
总结:单例对象的生命周期和容器相同
多例对象
出生:当我们使用对象时spring框架为我们创建
活着:对象只要是我们使用过程中就一直活着
死亡:当对象长时间不用,且没有别的对象引用时,由Java的垃圾回收器回收
依赖注入
Dependency Injection
Dependency Injection
能注入的数据
基本数据类型和String
其他bean类型(在配置文件中活着注解配置过的bean)
复杂类型/集合类型
注入的方式
使用构造函数提供
不常用
不常用
constructor-arg标签
type、index、name
匹配指定参数进行赋值,常用name
value
用于提供基本类型和String类型的数据
ref
用于指定其他的bean类型数据。他指的是在spring的Ioc核心容器中出现过的bean对象
优点:获取bean对象时,注入数据数据是必须操作,否则对象无法创建
缺点:改变了bean对象实例化方式,创建对象时不需要这些数据也需要提供
使用set方法提供
比构造函数方式常用
比构造函数方式常用
property标签
name、value、ref
子标签实现复杂类型
eg:array->value
优缺点和构造函数提供相反
使用注解提供
@Component
用于把当前类对象存入spring容器中
属性
value:用于指定bean的id,默认值是当前类名,首字母改成小写
@Controller
一般用于表现层
@Service
一般用于业务层
@Repository
一般用于持久层
后面三个作用和属性和Component是一样的
只是用于明确三层使用的注解,使三层对象更加清晰
只是用于明确三层使用的注解,使三层对象更加清晰
用于注入数据的
作用和xml配置文件中bean标签写一个<property>标签作用是一样的
@Autowired
作用:自动按照类型注入,只要容器中有唯一的一个bean对象类型和要注入的变量类型匹配,就可以注入成功
如果ioc容器中没有任何bean的类型和要注入的变量类型匹配,则报错;如果Ioc容器中有多个类型匹配时
出现位置:可以是变量上,也可以是方法上
细节:在使用注解注入时,set方法就不是必须的了
@Qualifier
作用:在按照类中注入的基础上再按照名称注入。它给类成员注入时不能单独使用。但是在给方法参数注入时可以
属性
value:用于指定注入bean的id
@Resource
作用:直接按照bean的id注入。可以独立使用
属性
name:用于指定bean的id
以上三个注入都只能注入其他bean类型的数据,而基本类型和String类型无法使用上述注解实现
另外,集合类型的注入只能通过xml实现
另外,集合类型的注入只能通过xml实现
@Value
作用:注入基本类型和String类型的数据
属性
value:用于指定数据的值。他可以使用spring中SpEL(也就是spring的el表达式)
SpEL写法:${表达式}
SpEL写法:${表达式}
用于改变范围的
作用和bean标签中使用的scope属性实现的功能是一样的
@Scope
作用:用于指定bean的作用范围
属性
value:指定范围的取值。常用取值:singleton prototype
和生命周期相关(了解)
作用和bean标签中使用init-method和destroy-method的作用是一样的
@PreDestroy
用于指定销毁方法
@PostConstruct
用于指定初始化方法
@Configuration
指定当前类是一个配置类,和bean的xml是一样的
细节
当配置类作为AnnotationConfigApplicationContext对象创建的参数时,该注解可以不写
@ComponenScan
用于通过注解指定spring在创建容器时要扫描的包
@ComponentScan(basePackages = "com.example")
属性
value:和basePackage的作用是一样的,都是用于指定创建容器时要扫描的包
<context:component-scan base-package="com.example"></context:component-scan>
<context:component-scan base-package="com.example"></context:component-scan>
@Bean
作用
用于把当前方法返回值作为bean对象存入spring的ioc容器中
属性
name:用于指定bean的id。不写时,默认值为当前方法名称
细节
当我们使用注解配置方法,如果方法有参数,spring框架会去容器中查找有没有可用的bean对象
查找的方式和Autowired注解作用是一样的
查找的方式和Autowired注解作用是一样的
@Import
作用
导入其他配置类
属性
value:用于指定其他配置类的字节码
当我们使用Import的注解之后,有Import注解的类为父配置类,而导入的都是子配置类
当我们使用Import的注解之后,有Import注解的类为父配置类,而导入的都是子配置类
@PropertySource
作用
用于指定properties文件的位置
属性
value:指定文件的名称和路径
关键字:classpath,表示类路径下
关键字:classpath,表示类路径下
AOP(面向切面编程)
Aspect Oriented Programming
Aspect Oriented Programming
动态代理
特点
字节码随用随创建,随用随加载
作用
不修改源码的基础上对方法增强
分类
基于接口的动态代理
基于子类的动态代理
基于接口的动态代理
涉及的类:Proxy
提供方:JDK官方
如何创建代理对象
使用Proxy类中的newProxyInstance方法
创建代理对象的要求
被代理类最少实现一个接口,如果没有则不能使用
newProxyInstance方法的参数
ClassLoader:类加载器
它是用于加载代理对象字节码的。和被代理对象相同的类加载器。固定写法
Class[]:字节码数组
他是用于让代理对象和被代理对象有相同的方法。固定写法
InvocationHandler:用于提供增强的代码
他是让我们写如何代理。我们一般都是写一个该接口的实现类,通常情况下都是匿名内部类,但是不是必须的
此接口的实现类都是谁用谁写
作用
在程序运行期间,不修改源码已有方法进行增强
简单来说他就是把我们程序重复的代码抽取出来,在需要执行的时候,使用动态代理的技术,在不修改源码的基础上,对我们已有的方法进行增强
优势
减少重复代码
提高开发效率
维护方便
常用场景
AOP统一异常处理
AOP日志记录
常用的切入点在service层
连接点Joinpoint
指的是那些被拦截到的点。在spring中,这些点指的是方法,因为spring只支持方法类型的连接点
切入点Pointcut
所谓切入点是指我们要对哪些Joinpoint进行拦截的定义
spring中基于xml的AOP配置
把通知的Bean也交给spring来管理
aop:config标签表明开始AOP配置
属性
id:给切面一个唯一标识
ref:指定通知类bean的id
在aop:aspect标签的内部使用对应标签来配置通知的类型
示例:用printLog方法在切入点方法执行之前,所以是前置通知
示例:用printLog方法在切入点方法执行之前,所以是前置通知
aop:before:表示配置前置通知
切入点方法执行前执行
aop:after-returning:配置后置通知
切入点方法正常执行后执行,和异常通知互斥
aop:after-throwing:配置异常通知
切入点方法执行产生异常后执行
aop:after-after:配置最终通知
无论切入点方法是否正常执行他都会在其后面执行
aop:after-around:配置环绕通知类
获取目标方法入参
Object[] args = invocation.getArguments();
目标方法调用前执行
System.out.println("How are you!");
通过反射机制调用目标方法
Object obj = invocation.proceed();
目标方法调用后执行
System.out.println("Please enjoy yourself!");
切入点表达式写法
关键字
execution表达式
表达式
访问修饰符 返回值 包名.包名.包名.类名.方法名(参数列表)
标准表达式写法
public void com,example.service.impl.AccountServiceImpl.saveAccount()
访问修饰符可以省略
返回值可以使用通配符,表示任意返回值
* com,example.service.impl.AccountServiceImpl.saveAccount()
包名可以使用通配符,表示任意包,但是有几级包,就需要写几个*.
* *.*.service.impl.AccountServiceImpl.saveAccount()
包名可以使用..表示当前包及其子包
* *..AccountServiceImpl.saveAccount()
全通配写法
* *..*.*(..)
收藏
0 条评论
下一页