Aop 初学者
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Aop 初学者相关的知识,希望对你有一定的参考价值。
面向 “Aop” (切面)编程
配置applicationContext.xml
1.三种注入方式
//创建存储数据的类
public class happyServlet {
private String info;
public happyServlet() {
}
public happyServlet(String info) {
this.info = info;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
public void work(){
System.out.println("我是Info::"+info);
}
}
1.1 set方法注入本质上是调用了Bean的setXXX()方法进行值的注入
//配置 xml 调用类中参数进行赋值。
//id: 理解为我们 happyServlet实例对象或者是别名
//class : 是调用类的路径
<bean id="Day01" class="cn.happy.Day01.happyServlet">
//name:为我们的创建的属性
//value:值
<property name="info" value="大明星"></property>
</bean>
1.2 构造注入
1.给实体类添加构造
2.通过constructor-arg设置的参数的值
结论:如果构造注入和set方法注入应用到同一个属性上,那么优先级高的是set方法注入
<bean id="Day01" class="cn.happy.Day01.happyServlet">
<constructor-arg index="0" value="ss"></constructor-arg>
<property name="info" value="我是大明星"></property>
</bean>
1.3 p命名空间注入
1.引入命名空间
2.不再使用bean的子节点,提炼成属性 p:info , p:info-ref="我是大明星" 提炼构造中的方法
<bean id="Day01" class="cn.happy.Day01.happyServlet" p:info="我是大明星">
</bean>
// 调用我们的测试类测试我们传输的数据
@Test
public void ss() {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
happyServlet srvice = (happyServlet) context.getBean("Day01");
srvice.work();
}
2.集合属性注入
public class MyColleaction {
public MyColleaction() {
System.out.println("我是大明星");
}
private String[]array;
private List<String>list;
private Set<String>set;
private Map<String,String>map;
private Properties properties;
public String[] getArray() {
return array;
}
public void setArray(String[] array) {
this.array = array;
}
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
public Set<String> getSet() {
return set;
}
public void setSet(Set<String> set) {
this.set = set;
}
public Map<String, String> getMap() {
return map;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
public Properties getProperties() {
return properties;
}
public void setProperties(Properties properties) {
this.properties = properties;
}
}
//xml
<bean id="colleaction" class="cn.happy.Day04.MyColleaction" >
<!-- scope="prototype" 手动控制不让计算机自己创建对象 autowire="byName" 根据方法对象注入 byType 类型注入只允许有一个 -->
<property name="array">
<array>
<value>刘德华</value>
</array>
</property>
<property name="list">
<list>
<value>庞中华</value>
</list>
</property>
<property name="set">
<set>
<value>方中华</value>
</set>
</property>
<property name="properties">
<props>
<prop key="001">邓紫棋</prop>
</props>
</property>
<property name="map">
<map>
<entry key="01">
<value>邓丽君</value>
</entry>
</map>
</property>
</bean>
3.IOC和DI
IOC侧重的是思想 ,DI实现
IOC侧重构造对象:通过容器 DI对属性值进行注入 (普通属性和域属性的注入)
4.AOP:Aspect Oriented Programming 面向切面编程 增强类
OOP 面向对象编程
OOD
OOA
5.AOP
前置增强 MethodBeforeAdvice
引入一个节点
aspectjweaver
<!-- https://mvnrepository.com/artifact/aspectj/aspectjweaver -->
<dependency>
<groupId>aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.5.3</version>
</dependency>
//案例
//aop
public class MyBeforeAdvice implements MethodBeforeAdvice {
//AfterReturningAdvice 后置增强
public void before(Method method, Object[] objects, Object o) throws Throwable {
System.out.println("记录日志");
}
}
//Dao
public interface SomeDao {
public void ss();
}
//
public class SomeDaoImpl implements SomeDao{
public void ss() {
System.out.println("加油 ! 努力 !");
}
}
//servlet
public interface SomeServlet {
public void ss();
}
//实现
public class SomeServletImpl implements SomeServlet{
SomeDao som=new SomeDaoImpl();
public SomeDao getSom() {
return som;
}
public void setSom(SomeDao som) {
this.som = som;
}
public void ss() {
som.ss();
}
}
//xml
<bean id="someDao" class="cn.happy.Day03.dao.SomeDaoImpl"></bean>
<bean id="someServlet" class="cn.happy.Day03.service.SomeServletImpl">
<property name="som" ref="someDao"></property>
</bean>
<bean id="advice" class="cn.happy.Day03.aop.MyBeforeAdvice"></bean>
<aop:config>
<aop:pointcut id="MyBeforeAdvice" expression="execution(* *..service.*.*(..))"></aop:pointcut>
<aop:advisor advice-ref="advice" pointcut-ref="MyBeforeAdvice"></aop:advisor>
</aop:config>
6.AOP概念
1.面向切面编程 Aspact Oriented Programming
2.7个专业术语
增强处理/通知(Advice)
增强类中的方法
切入点(Pointcut)
符合切点表达式的方法才能称为切入点
连接点(Join Point)
目标对象中的所有方法都是连接点
切面(Aspect)
增强类
目标对象(Target object)
等待被增强的对象
AOP代理(AOP proxy)
代理对象,内存中创建的。
织入(Weaving)
将切面和目标对象进行绑定的过程
以上是关于Aop 初学者的主要内容,如果未能解决你的问题,请参考以下文章
Spring初学之annotation实现AOP前置通知和后置通知
Spring初学之annotation实现AOP前置通知后置通知返回通知异常通知。