关于对Spring中IOC与AOP的理解
Spring框架用过很多次,一直对它的一些功能不是很了解,最近仔细研究了一下。
IOC(控制反转):控制反转,顾名思义就是一个控制权的转向问题,就比如皇帝管着臣子,有一天有一个臣子篡权夺位,臣子开始管理皇帝和其他人,这就一个控制反转。有反转就意味着有正转,正转就是哪里需要对象,就在哪里去new对象。例如:老师想要获得学生的英语成绩,那就要new学生对象,利用学生去获取成绩。
代码:
public class Teacher{
public int getEnglishScore(){
Student student=new Student();
int score=student.getEnglish();
return score;
}
}
在Spring中,控制反转就是将创建对象的权利交给Spring容器去管理。程序员只需要去调用就可以了。如上例,只需要在spring.xml中去声明
spring.xml(setter注入):
<bean id="stu" class="com.school.bean.Student"></bean> <!--声明学生bean-->
<bean id="teacher" class="com.school.bean.Teacher"> <!--声明老师bean-->
<property name="student" ref="stu"></property> <!--将学生bean注入只老师bean中-->
注意:property标签中的name值要与代码中的setter的值一样,ref的值要与声明的id一致!!!
</bean>
public class Teacher{
private Student student;
public void setStudent(Student student){
this.student=student;
}
public int getEnglishScore(){
int score=student.getEnglish();
return score;
}
}
AOP(面向切面编程):面向切面在我理解为就是将一个圆柱体从想要插入的地方切开,然后将自己想要增加的功能放进去。<aop:config>
<aop:pointcut id="pointcut" expression="execution(* com.school.bean.Teahcer.getEnglishScore())"/> <!--配置切点,定义在哪里切。像本例一样,在执行老师获取英语成绩时,定义一个切点-->
<aop:aspect id="tAop" ref="stu"> <!--定义切面,即为在老师获取英语成绩时添加功能-->
<aop:before method="getStudentName()" pointcut-ref="pointcut"/> <!--在老师获取英语成绩之前,获得学生的姓名-->
</aop:aspect>
</aop:config>
还有一个通知
<tx:advice id="txAdvice" transaction-manager="transactionManager"> <!--定义一个通知,将通知中执行的方法与事务相关联,以事务的形式去执行-->
<tx:method name="get*" propagation="REQUIRED" />
</tx:advice>
<aop:config>
<aop:pointcut id="pointcut" expression="execution(* com.school.bean.Teahcer.getEnglishScore())"/> <!--配置切点,定义在哪里切。像本例一样,在执行老师获取英语成绩时,定义一个切点-->
<aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut"/> <!--定义一个通知器,当执行到切点时,会触发通知,此时的通知就相当于增加的功能,即增强-->
</aop:config>