spinrg
spring的bean
spring的bean是不是单例的?
spring的bean默认是单例的single。。注解标识
spring的单例bean是不是线程安全的?
单例bean如果内部的成员不变就是线程安全的,变的话就不是
spring的AOP
AOP是什么?
aop是切面编程,用于将那些与业务无关的对多个对象产生影响的公共内容抽取,共用复用,降低耦合
spirng的AOP通知有?
AOP通知
-
前置通知(Before advice):在目标方法执行之前执行,可以通过修改传入参数或者阻止目标方法的执行来改变目标方法的行为。
-
后置通知(After returning advice):在目标方法成功执行后执行,可以访问目标方法执行返回的结果,并对其进行处理。
-
异常通知(After throwing advice):在目标方法抛出异常时执行,可以捕获和处理异常信息,或者重新抛出异常。
-
最终通知(After advice):在目标方法执行完成后无论是否发生异常都会执行,通常用于释放资源等操作。
-
环绕通知(Around advice):在目标方法执行前后都执行,可以自由控制目标方法的执行过程,包括是否执行目标方法以及何时执行目标方法等。
项目中使用AOP?
我的项目中使用了aop的环绕通知+切点表达式(切哪里),记录日志,包含请求参数,路径,方法,方式
spring的事务实现?
spring的事务是通过aop的前后通知实现的,在前置通知里开启一个事务,在后置通知里面监听执行是否出错然后进行回滚
spring的事务失效?
1.自己捕获了异常,没有抛出,没有检查到异常不会回滚
2.抛出检查异常,检查范围太大没有检查到异常不会回滚
3.非public方法失效,因为spring的事务是根据AOP的,AOP只会拦截public的方法
4.内部调用,因为同一个类不会创建多个代理对象
spring的bean生命周期?
public class Dog implements BeanNameAware, InitializingBean, DisposableBean {private String name;public Dog(){System.out.println("1.实例化");}public void setName(String name){System.out.println("2.依赖注入");this.name = name;}public void init(){System.out.println("6.初始化");}public void myDestroy(){System.out.println("10.销毁");}@Overridepublic void setBeanName(String name) {System.out.println("3.设置beanName");}@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("5.InitialingBean接口");}@Overridepublic void destroy() throws Exception {System.out.println("9.DisposableBean接口");}
}
public class MyProcessor implements BeanPostProcessor {public Object postProcessBeforeInitialization(Object bean, String beanName) {if (bean instanceof Dog||beanName.equals("dog")) {System.out.println("4.初始化前");}return bean;}public Object postProcessAfterInitialization(Object bean, String beanName) {if (bean instanceof Dog||beanName.equals("dog")) {System.out.println("7.初始化后");}return bean;}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="dog" class="com.wn.older.Bean.Dog" init-method="init" destroy-method="myDestroy"><property name="name" value="旺财"/></bean><bean id="myProcessor" class="com.wn.older.Bean.MyProcessor"/>
</beans>
public class AppTest {@Testpublic void testApp(){ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");context.getBean(Dog.class);System.out.println( "8.使用bean");//close((ClassPathXmlApplicationContext)context).close();}
}
Bean的生命周期
5步骤
1.实例化
2.依赖注入
3.初始化
4.使用bean
5.销毁bean7步骤
1.实例化
2.依赖注入
#3.初始化前
4.初始化
#5.初始化后
6.使用bean
7.销毁bean10步骤
1.实例化 --调用构造方法
2.依赖注入 --成员赋值
#3.BeanNameAware BeanFactoryAre --调用setbeanname方法为beanName赋值
4.初始化前 --初始化之前调用的方法
#5InitialingBean接口 --调用afterpropertiesSet方法
6.初始化 --调用自定义初始化方法
7.初始化后 --初始化之后调用的方法
8.使用bean --拿到bean的上下文
#9.DisposableBean接口 --销毁前调用的接口
10.销毁bean --销毁调用