spring自定义注解

spring AOP的基本概念

早过忘川 提交于 2020-04-02 21:49:59
AOP的概念和使用原因   现实中有一些内容并不是面向对象(OOP)可以解决的,比如数据库事务,它对于企业级的Java EE应用而言是十分重要的,又如在电商网站购物需要经过交易系统、财务系统,对于交易系统存在一个交易记录的对象,而财务系统则存在账户的信息对象。从这个角度而言,我们需要对交易记录和账户操作形成一个统一的事务管理。交易和账户的事务,要么全部成功,要么全部失败。   交易记录和账户记录都是对象,这两个对象需要在同一个事务中控制,这就不是面向对象可以解决的问题,而需要用到面向切面的编程,这里的切面环境就是数据库事务。   AOP编程有着重要的意义,首先它可以拦截一些方法,然后把各个对象组织成一个整体,比如网站的交易记录需要记录日志,如果我们约定好了动态的流程,那么就可以在交易前后、交易正常完成后或者交易异常发生时,通过这些约定记录相关的日志了。   回到JDBC的代码中,令人最讨厌和最折腾的问题永远是无穷无尽的try...catch...finally...语句和数据库资源的关闭问题,而且这些代码会存在大量重复,加上开发者水平参差不齐。Spring出现前,在Java EE的开发中,try...catch...finally语句常常被严重滥用,使得Java EE的开发存在着许多问题,虽然MyBatis对JDBC做了良好的封装,但是还是不足的。  

SpringAOP在web应用中的使用

帅比萌擦擦* 提交于 2020-04-02 16:12:39
之前的aop是通过手动创建代理类来进行通知的,但是在日常开发中,我们并不愿意在代码中硬编码这些代理类,我们更愿意使用DI和IOC来管理aop代理类。Spring为我们提供了以下方式来使用aop框架 一、以声明的方式配置AOP(就是使用xml配置文件) 1.使用ProxyFactoryBean的方式: ProxyFactoryBean类是FactoryBean的一个实现类,它允许指定一个bean作为目标,并且为该bean提供一组通知和顾问(这些通知和顾问最终会被合并到一个AOP代理中)它和我们之前的ProxyFactory都是Advised的实现。 以下是一个简单的例子:一个学生和一个老师,老师会告诉学生应该做什么。 public class Student { public void talk() { System.out.println("I am a boy"); } public void walk() { System.out.println("I am walking"); } public void sleep() { System.out.println("I want to sleep"); } } 老师类 public class Teacher { private Student student; public void tellStudent(){

Spring Boot实践——AOP实现

随声附和 提交于 2020-04-01 07:56:45
Spring AOP 介绍   AOP的介绍可以查看 Spring Boot实践——AOP实现   与AspectJ的静态代理不同,Spring AOP使用的动态代理,所谓的动态代理就是说AOP框架不会去修改字节码,而是在内存中临时为方法生成一个AOP对象,这个AOP对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调原对象的方法。   Spring AOP中的动态代理主要有两种方式,JDK动态代理和CGLIB动态代理。JDK动态代理通过反射来接收被代理的类,并且要求被代理的类必须实现一个接口。JDK动态代理的核心是 InvocationHandler 接口和 Proxy 类。   如果目标类没有实现接口,那么Spring AOP会选择使用CGLIB来动态代理目标类。CGLIB(Code Generation Library),是一个代码生成的类库,是利用asm开源包, 可以在运行时动态的生成某个类的子类 。注意,CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为 final ,那么它是无法使用CGLIB做动态代理的。   这里有注意的几点如下: 从Spring 3.2以后不再将CGLIB放在项目的classpath下,而是将CGLIB类打包放在spring-core下面的org.springframework中

二、外部化配置--SpringBoot功能

∥☆過路亽.° 提交于 2020-03-30 18:52:07
一、外部化配置 Spring Boot将你的配置外部化,因此你可以在不同的环境下运行相同的代码。你可以使用 properties 文件, YAML 文件,环境变量,命令行参数在外部配置。使用@Value注解可以直接将属性值注入到bean中,通过Spring的 Environment 抽象访问,或通过 @ConfigurationProperties 绑定到结构化对象。 Spring Boot有多种外部配置方式,优先级如下: 当devtools开启时, $HOME/.config/spring-boot 下devtools的全局设置属性。 测试上的@TestPropertySource注解 测试中的 properties 属性。 在 @SpringBootTest 和测试注释上可用,用于测试应用程序的特定部分。 命令行参数 来自 SPRING_APPLICATION_JSON 的属性(嵌入在环境变量或系统属性中的内联JSON) ServletConfig 的初始参数. ServletContext 初始参数 来自 Java:comp / env 的JNDI属性。 Java系统属性( System.getProperties() ). 操作系统环境变量. RandomValuePropertySource 仅具有 random.* 属性. jar包外部的application-

SSM框架中IoC、DI与AOP的理解

断了今生、忘了曾经 提交于 2020-03-30 13:06:38
  框架封装了普通项目中程序员需要重复书写的代码和调用过程,就比如说在传统的jsp项目中,我们的controller接收到前端的请求然后程序员就需要去开发Dao层,里面还涉及数据库的连接和存储过程的代码,大部分都是冗余的代码,而有了SSM框架后极大的简化了程序猿在controller以下层的开发,只需要一个service层和mapper层就行了,mapper层用来连接mapper.xml文件的,而直接用mapper.xml做sql语句的开发就行了,而数据库连接的和存储的过程都直接由Mybatis负责了,你只需要负责传递形参和接收返回数据就行了,这样就完成了一次完整的数据库交互! 1.1、IoC是什么   Ioc— Inversion of Control ,即“控制反转”,不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。如何理解好Ioc呢?理解好Ioc的关键是要明确“谁控制谁,控制什么,为何是反转,哪些方面反转了”,那我们来深入分析一下: ● 谁控制谁,控制什么: 传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对象的创建;谁控制谁?当然是IoC 容器控制了对象;控制什么

Spring Data 之 Repository 接口

本小妞迷上赌 提交于 2020-03-27 09:08:16
1. 介绍 Repository 是一个空接口,即是一个标记性接口; 若我们定义的接口继承了Repository,则该接口会被IOC容器识别为一个 Repository Bean ; 也可以通过 @RepositoryDefinition 注解,来替代继承 Repository 接口; // 源码: public interface Repository<T, ID extends Seriallizable>{ } // 使用继承的方式 public interface PersonRepository extends Repository<Person, Integer>{ Person getByLastName(String lastName); } // 使用注解替代继承 @RepositoryDefinition(domainClass=Person.class, idClass=Integer.class) public interface PersonRepository{ Person getByLastName(String lastName); } 2. Repository 接口的子接口 CrudRepository :继承 Repository ,实现了一组CRUD相关的方法; PagingAndSortingRepository

Spring-Data-Jpa环境配置与实际应用

我们两清 提交于 2020-03-26 12:09:50
上次我们讲述了《 Spring-Data-Jpa概述与接口 》,接下来我们再讲讲Spring-Data-Jpa环境配置与实际应用。 Spring-Data 方法定义规范与使用配置 简单条件查询: 查询某一个实体类或者集合 按照 Spring Data 的规范,查询方法以 find | read | get 开头,涉及条件查询时,条件的属性用条件关键字连接,要注意的是:条件属性以首字母大写。 例如:定义一个 Entity 实体类: class User{ private String firstName; private String lastName; } 使用And条件连接时,应这样写: findByLastNameAndFirstName(String lastName,String firstName); 条件的属性名称与个数要与参数的位置与个数一一对应 直接在接口中定义查询方法,如果是符合规范的,可以不用写实现,目前支持的关键字写法如下: @Query注解 这种查询可以声明在 Repository 方法中,摆脱像命名查询那样的约束,将查询直接在相应的接口方法中声明,结构更为清晰,这是 Spring data 的特有实现。 @Query来指定本地查询 自定义 Repository 方法 定义一个接口: 声明要添加的, 并自实现的方法 提供该接口的实现类: 类名需在要声明的

spring boot --开发web应用程序

拈花ヽ惹草 提交于 2020-03-26 09:47:33
3 月,跳不动了?>>> Spring MVC 自动配置 Spring Boot 提供了适用于大多数 Spring MVC 应用的自动配置 自动配置在 Spring 默认功能上添加了以下功能: 引入 ContentNegotiatingViewResolver 和 BeanNameViewResolver bean。 支持服务静态资源,包括对 WebJar 的支持。 自动注册 Converter 、 GenericConverter 和 Formatter bean。 支持 HttpMessageConverter 。 自动注册 MessageCodesResolver 。 支持静态 index.html。 支持自定义 Favicon 。 自动使用 ConfigurableWebBindingInitializer bean。 HttpMessageConverters Spring MVC 使用 HttpMessageConverter 接口来转换 HTTP 的请求和响应 自定义 JSON Serializer 和 Deserializer 自定义序列化器(serializer)的做法通常是通过 一个模块来注册 Jackson , 然而 Spring Boot 提供了一个备选的 @JsonComponent 注解,它可以更加容易地直接注册 Spring Bean。

曹工说Spring Boot源码(24)-- Spring注解扫描的瑞士军刀,asm技术实战(上)

不羁岁月 提交于 2020-03-25 23:42:32
写在前面的话 相关背景及资源: 曹工说Spring Boot源码(1)-- Bean Definition到底是什么,附spring思维导图分享 曹工说Spring Boot源码(2)-- Bean Definition到底是什么,咱们对着接口,逐个方法讲解 曹工说Spring Boot源码(3)-- 手动注册Bean Definition不比游戏好玩吗,我们来试一下 曹工说Spring Boot源码(4)-- 我是怎么自定义ApplicationContext,从json文件读取bean definition的? 曹工说Spring Boot源码(5)-- 怎么从properties文件读取bean 曹工说Spring Boot源码(6)-- Spring怎么从xml文件里解析bean的 曹工说Spring Boot源码(7)-- Spring解析xml文件,到底从中得到了什么(上) 曹工说Spring Boot源码(8)-- Spring解析xml文件,到底从中得到了什么(util命名空间) 曹工说Spring Boot源码(9)-- Spring解析xml文件,到底从中得到了什么(context命名空间上) 曹工说Spring Boot源码(10)-- Spring解析xml文件,到底从中得到了什么(context:annotation-config 解析)

spring给容器中注入组件的几种方式

不问归期 提交于 2020-03-25 13:29:21
目录 环境搭建 <!-- https://mvnrepository.com/artifact/org.springframework/spring-context --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.1.5.RELEASE</version> </dependency> spring给容器中注入组件 br/>1.包扫描+组件标注注解(@Controller/@Service/@Repository/@Component)适用于把自己写的类加入组件(默认ID类名首字母小写) 此种方式比较简单就不贴代码了 2.@Bean[导入的第三方包里面的组件] (注意一定要在这个配置类上加上@Configuration) // @Scope指定作用域 // prototype:多实例的:ioc容器启动并不会去调用方法创建对象放在容器中。 // 每次获取的时候才会调用方法创建对象; // singleton:单实例的(默认值):ioc容器启动会调用方法创建对象放到ioc容器中。 // 以后每次获取就是直接从容器(map.get())中拿, // request:同一次请求创建一个实例 // session