spring aop 通过切点指定在哪些类哪些方法进行织入横切逻辑,通过增强描述横切逻辑的具体实现,通过切面把切点和增强
链接到一起
spring aop 默认用的事jdk 动态代理,如果代理类没有实现接口,则用cglib,如果代理类实现接口则用的事jdk动态代理
cglib 采用asm 技术操作字节码 使用cglib 需要注意的是代理的方法不能加上final 修饰,jdk动态代理 需要把java 编译成 class 文件然后再操作字节码
aop 应用场景 spring 事物的管理
项目中的应用,比如日志表。用来显示流程图的流转
在spring xml 中 添加 aop 的标签
<!-- 定义aspectj -->
<aop:aspectj-autoproxy proxy-target-class="true" />
定义一个类,这个类必须定义到spring 能扫描的包下面
在类上加上注解
@Aspect
定义一个方法 加上切点的注解 @Pointcut("execution(* com.techstar.service.OrderService.update*(..))")
定一个方法 加上增强的注解
@AfterReturning(value="updateServiceCall()", argNames="rtv", returning="rtv")
在方法中进行具体的代码实现
spring ioc 话术
bean 的创建和维护交给spring ioc 来管理,底层用的是反射机制,项目在启动的时候spring 扫描 bean 所在的包,采用反射机制class.forname().newInstence();实例化对象
存储到内部的concurrenthashmap 中。获取对象从concurrenthashmap 获取,依赖注入有三种方式 接口注入、构造器注入、属性注入
ssm 搭建话术
首先把spring、mybatis、数据库连接池、mysql驱动等jar 配置到pom文件中,然后在web.xml 配置contextConfigLocation 扫描spring的配置文件,
配置 ContextLoaderListener 监听,配置 DispatcherServlet
其次配置spring mvc文件 <context:component-scan> 扫描controller,配置JSP文件的位置,配置图片上传CommonsMultipartResolver
最后配置spring 文件 扫描service 路径,配置数据源,配置 SqlSessionFactoryBean,扫描mybatis配置文件,配置 MapperScannerConfigurer 扫描 dao
配置事务
<bean id="transactionMybatisManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<aop:config>
<aop:advisor pointcut="execution(* com.hy.gcar.service..*(..))" advice-ref="txAdvice" />
</aop:config>
<tx:advice id="txAdvice" transaction-manager="transactionMybatisManager">
<tx:attributes>
<tx:method name="get*" read-only="true" />
<tx:method name="query*" read-only="true" />
<tx:method name="find*" read-only="true" />
<tx:method name="load*" read-only="true" />
<tx:method name="select*" read-only="true" />
<tx:method name="*" propagation="REQUIRED" rollback-for="Exception" />
</tx:attributes>
</tx:advice>
BeanFactory和ApplicationContext有什么区别?
BeanFactory 可以理解为含有bean集合的工厂类。BeanFactory 包含了种bean的定义,以便在接收到客户端请求时将对应的bean实例化。
BeanFactory还能在实例化对象的时生成协作类之间的关系。此举将bean自身与bean客户端的配置中解放出来。BeanFactory还包含了bean生命周期的控制,调用客户端的初始化方法(initialization methods)和销毁方法(destruction methods)。
从表面上看,application context如同bean factory一样具有bean定义、bean关联关系的设置,根据请求分发bean的功能。但application context在此基础上还提供了其他的功能。
提供了支持国际化的文本消息
统一的资源文件读取方式
已在监听器中注册的bean的事件
以下是三种较常见的 ApplicationContext 实现方式:
1、ClassPathXmlApplicationContext:从classpath的XML配置文件中读取上下文,并生成上下文定义。应用程序上下文从程序环境变量中取得。
1
ApplicationContext context = new ClassPathXmlApplicationContext(“bean.xml”);
2、FileSystemXmlApplicationContext :由文件系统中的XML配置文件读取上下文。
1
ApplicationContext context = new FileSystemXmlApplicationContext(“bean.xml”);
3、XmlWebApplicationContext:由Web应用的XML文件读取上下文。
请解释Spring Bean的生命周期?
Bean的建立, 由BeanFactory读取Bean定义文件,并生成各个实例;
Setter注入,执行Bean的属性依赖注入;
BeanNameAware的setBeanName(), 如果实现该接口,则执行其setBeanName方法;
BeanFactoryAware的setBeanFactory(),如果实现该接口,则执行其setBeanFactory方法;
BeanPostProcessor的processBeforeInitialization(),如果有关联的processor,则在Bean初始化之前都会执行这个实例的processBeforeInitialization()方法;
InitializingBean的afterPropertiesSet(),如果实现了该接口,则执行其afterPropertiesSet()方法;
Bean定义文件中定义init-method;
BeanPostProcessors的processAfterInitialization(),如果有关联的processor,则在Bean初始化之前都会执行这个实例的processAfterInitialization()方法;
DisposableBean的destroy(),在容器关闭时,如果Bean类实现了该接口,则执行它的destroy()方法;
Bean定义文件中定义destroy-method,在容器关闭时,可以在Bean定义文件中使用“destory-method”定义的方法;