spring

interceptor 拦截器 introduce 介绍 parser解析器 aware 知道的 internal 内部的  decompile 反编译
threshold 阈值

 

依赖注入的三种方式(将依赖的对象放进去):

第一种是构造方法传入依赖注入的对象。

第二种是setter方法传入依赖注入的对象。

第三种是注解的方式。反射可以修改成员变量的可见性。

 

工厂容器和applicationcontext容器

Bean的声明周期:

1、第一步实例化(通过反射四中构建方法)

2、第二部ioc注入bean和值

3、如果实现了BeanNameAware,会调用setBeanNmae方法。

 

groupid什么项目组  artifactid模块id  relativepath联系路径。

packaging 属性名pom告诉别人这就是来继承的。

最后运行的是target里面编译好的东西。

 

applicationcontext的声明周期

切面:包含那些东西,在哪里进行切入。

配置文件配置aop,获取对象的时候要转型成

 

 

配置文件中一旦启用组件扫描,就会实例化一些特殊的bean。

context:component-scan base-package=“com.demo” //那么实际上他会自动补齐为 classpath:com.demo.**.*(两个*代表递归下面的所有包)

 

只要在容器中(applicationcontext、上下文)有一个类实现了BeanPostProcessor接口,那么,在容器中的每一个bean实例化都会调用里面的postProcessBeforeInitialzation方法,然后中间可以穿插一个你在bean中的init-method方法,之后再执行after方法

----------》》

internalAutowired这个类(的对象)就实现了beanpostprocessor接口,他使用的就是这个原理,然后在每个bean被实例化之后(所有的bean),他就会去扫描里面有没有需要自动注入的注解。@Autowired @Resource(把autowired换成common就是处理的resource注解)

--->>在上上一段之后,会调用bean中的destory的方法。可以进行一些资源的释放操作。

 

 

 

AOP:(一个类里面 的所有方法在执行前后要执行的代码抽离出来,我的理解)

一、(最原始的配置,了解)(只需要spring-aop那个包就可以了)xml配置代理对象的时候,class配置的是ProxyFactoryBean类,

然后这个类它继承了factoryBean接口(第四种实例化对象的方式)

可以通过它的getObject方法来获取到一个代理对象。

然后在代理对象里面配置被代理对象的接口、被代理对象的类,再实现一个类继承了MethodBeforeAdvice类,然后将这个类实例化也指定到代理对象的属性里面去。在这个类里面的before方法里面有三个参数,分别是Method(可以获取要切入的方法名),object [] args(要切入方法的参数),target

在从application里面拿对象的时候,需要将对象转型成实现的那个接口的引用类型。

 

二、(纯POJO切面)

<aop:config  proxy-target-class="">

     <aop:aspect  id=""  ref="">   这个是切面类,就是

            <aop:pointcut  id = "给这个切入点起个名字"  expression="这里面配置你要搞的表达式用来匹配要切入的方法">

                   <aop:before  method ="上面aop:aspect切面类里面的方法"    point-ref=

如果需要获取方法名字和参数,那么需要在切面类的before方法里面传入一个对象(传统的是插入三个对象)JoinPoint。

 

三、注解

三部分,一个切面类(@aspect和@component(如果开启扫描就不需要了)),然后切面类里配置方法,和切入点,然后在bean里面实例化

@pointcut("execution()") //这里面写一个表达式,用来匹配你要切入那些类的哪些方法。

public void beforepoint(){}  //这就是随便一个方法就可以,暂时没有发现作用,发现作用,在下面定义before方法切入到哪里时需要

@Before("com.demo.spring.Advice.beforePoint") //这里就是使用上面的那个方法。注解在方法上面,所以使用这个方法。在这里定义你的before方法要切入到哪个类的方法里面去。就是上面beforepoint上面注解的表达式。

 

静态代理

就是自己定义一个代理类,然后这个代理类调用被代理类的方法,然后在代理类里面有一个有一个被代理类的实例,可以在使用构造函数实例化代理类的时候,把被代理对象放进去

动态代理

jdk代理,由java内部的反射机制来实现,而cglib动态代理则是借助底层的asm的字节码工具来实现的。

cglib动态代理,有时候我们想要实现一个代理类的时候,发现被代理类已经被写好了,而且没有使用接口,怎么办?我们就可以使用cglib动态代理,就是让代理类继承被代理类,然后先写一个before然后在super.调用父类的方法。这个样子。

jdk代理,由java内部的反射机制来实现,而cglib动态代理则是借助底层的asm的字节码工具来实现的。

反射在生成类的过程中比较高效,而asm执行高效。

jdk使用的前提就是被代理类(以前的项目)已经被写好,不方便再实现统一的接口。

 

dao支撑,每种数据库链接技术的报的异常都不一样(如mybatis、jdbc等),通过spring的数据整合,让主键重复报的异常都一样。

*匹配任何数量字符。..匹配任何数量的字符重复(所有子包,在方法中则是所有参数)。

 

aop动态传入多个对象(动态 代理,两种方式),织入公共代码

传统的需要实现接口,pojo不需要实现接口。注解的方式(要注意在xml里面启用注解使用,在事务的时候也要开启。)

注意aspect要加两个注解,一个@Aspect 和 @component。

 

声明式事务,spring-tx    spring-jdbc  再来一个驱动jar包 com.core.mysql.connector,再来一个连接池。

 

连接池

jdbctemplate就是把一些打开数据连接、关闭数据库连接等的操作不用自己实现,自己只需要调用execute、update等就可以了。

使用:在xml文件中配置好之后,直接在dao层autowired就可以使用了(jdbctemplate.execute("sql语句",arg0,arg1))

在主键重复时,使用jdbc和mybatis(jdbc的封装)抛出来的异常都不一样,

spring的dao会帮我们把异常名给统一了

 

事务如何做到的,一般是在service层做事务的,然后调用service层的代理类,在代理类里面织入环绕通知(前后),然后将Connection在service层搞一个threshold,将这个Connection放到threshold里面去。这样,就算调用多个dao层的多条sql语句(正常的话是多个connection),也使用的是同一个connection,好做事务。

 

spring-tx事务切面的配置:

首先是定义一个切点(这里面配置你再什么地方要切入事务,然后再在tx:advice里面配置刚才你切入事务 的地方里面的(我们举的例子是service层里面的方法)哪些方法你要进行什么操作(回滚主要是,我认为)),然后将一个通知引用(txadvice,我觉得这个应该就是代理类------应该不是)和切点组合起来,然后再配置通知引用,在里面配置什么(什么时候事务进行回滚) propagation:必须需要一个事务,这是事务的传播行为(以前有事务就行,没有事务就开一个),运行时异常(默认的还有error)会进行回滚。

我们把这些属性配置完之后,需要tranctionmanager来进行管理事务(在代理里面真正执行事务控制的是tranctionmanager)。

配置完这两个之后,在上面再配置一个tranctionManager的bean,里面有属性是datasource,用来开启事务。

 

使用注解进行事务控制。

 

 

 

spring-aop spring-aspects(前面那个是传统。aspect-j接口专门用于做aop编程(普通的aspect只能匹配普通方法,不能匹配构造方法))

 

基于代理的  程序运行起来以后,动态生成代理对象。 而aspectj在编译的时候就可以进行搞好。

配置,现在xml里面实例化了相应的bean,然后配置一个aop的配置。然后再新建一个类,在上面注解component、aspect。然后在搞一个方法上面搞一个

 

切面:-------------------------------------------------------------------------------------

try{

前置通知

m1();

返回通知

}catch{

异常通知

}

后置通知

环绕通知(主动掉方法,然后在方法前后加前、后置通知)

切入点。链接到前置、后置?等等。

-----------------------------------------------------------------------------------------------

 

为什么要实现代理类和被代理类要实现同样的接口。 

因为你的被代理类如果想要调用代理类的方法,就必须知道它有些什么方法,就只能实现同一个接口。

 

spring的aop(动态代理模式实现的。)是基于jdk的动态代理的

1454.  上午的切面。

一种如果有接口就使用jdk自带的动态代理,另一种如果没有接口就使用cglib(ASM字节码工具)代理。

 

注解不需要进行set方法,因为他会反射修改可见性为private然后加set方法(我猜)

1610 异常捕获

1618数据库连接

为什么声明式事务要放在service层,因为有可能会有多个dao,多个数据库连接。

运行时异常,如果方法,声明抛出运行时异常

事务隔离4级别 oracle2个,mysql四个都支持。

 

不要在service层捕获异常,否则事务管理器就会接受不到异常。

result取到的是一行一行 的数据

aop(三种方式配置)和数据访问集成梳理完之后

写一个service对象。事务管理,增删改查,日志记录。

 

spring自带两种容器:一个是factorybean,一个是上下文,factory已经被抛弃了。

 

 

<!--    如果在这个里面的话,他就会被管理,不会被主动被继承,如果想在子pom文件中被使用,只能明确去声明它-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-aop</artifactId>
                <version>5.2.8.RELEASE</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

 

classpathxmlapplication 配置的文件他会去哪儿找配置文件?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值