Spring是什么?Spring作用?
1.Spring 粗解:
Spring是针对于复杂的项目而产生的,用于项目的管理。使用JavaBean代替EJB 降低项目各层次之间的耦合性。(Spring的配置大于约定)
2. Spring的主要两方面:IOC(控制反转) + AOP(依赖注入)
1. IOC(可以看做是一个容器):https://www.cnblogs.com/best/p/5727935.html
不再跟之前Person person =new Person() 一样 构造对象 ,而是通过Spring的配置文件.xml 统一管理对象,通过依赖注入对象。--- 获得依赖对象的方式反转了。
IOC的实现方式有两种:1)xml配置的方式。2)注解的形式
1)xml配置文件的形式
代码:
IBookDAO bookDAO; //容器 ApplicationContext ctx=new ClassPathXmlApplicationContext("IOCBeans01.xml");//从容器中获得id为bookdao的bean bookDAO=(IBookDAO)ctx.getBean("bookdao"); |
<bean id="bookdao" class="com.zhangguo.Spring051.ioc01.BookDAO"></bean> |
2)注解的方式
/** * 实现类的 类注解 */ @Component("bookdaoObj") 它可以被Spring容器识别,启动Spring后,会自动把它转成容器管理的Bean。 除了@Component外,Spring提供了3个功能基本和@Component等效的注解,分别对应于用于对DAO,Service,和Controller进行 注解。 1:@Repository 用于对DAO实现类进行注解。2:@Service 用于对业务层 service 注解,但是目前该功能与 @Component 相同。 3:@Constroller用于对控制层 controller 注解,但是目前该功能与 @Component 相同。 4:@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行注解 |
IOC控制反转:说的是创建对象实例的控制权从代码控制剥离到IOC容器控制,实际就是你在xml文件控制,侧重于原理。
DI依赖注入:说的是创建对象实例时,为这个对象注入属性值或其他对象实例后,侧重于实现。
2. AOP 面向切面编程
所谓"切面",简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。
AOP编程其实是很简单的事情,纵观AOP编程,程序员只需要参与三个部分:
1、定义普通业务组件
2、定义切入点,一个切入点可能横切多个业务组件
3、定义增强处理,增强处理就是在AOP框架为普通业务组件织入的处理动作
所以进行AOP编程的关键就是定义切入点和定义增强处理,一旦定义了合适的切入点和增强处理,AOP框架将自动生成AOP代理,即:代理对象的方法=增强处理+被代理对象的方法。依赖:两个jar包:1、aopalliance.jar2、aspectjweaver.jar
实现方式:1)XML实现方式
<!-- 被代理对象 --> <bean id="math" class="com.zhangguo.Spring052.aop01.Math"></bean> <!-- 通知 --> <bean id="advices" class="com.zhangguo.Spring052.aop01.Advices"></bean> <!-- aop配置 --> <aop:config proxy-target-class="true"> <!--切面 --> <aop:aspect ref="advices"> <!-- 切点 --> <aop:pointcut expression="execution(* com.zhangguo.Spring052.aop01.Math.*(..))" id="pointcut1"/> <!--连接通知方法与切点 --> <aop:before method="before" pointcut-ref="pointcut1"/> <aop:after method="after" pointcut-ref="pointcut1"/> </aop:aspect> </aop:config> |
2.注解配置实现AOP
/** * 被代理的目标类 */ @Service("math") 、、/** */ 、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、 @Aspect //表示声明一个切面 public class Advices { @Before("execution(* com.zhangguo.Spring052.aop02.Math.*(..))") 表示before为前置通知,通过参数execution声明一个切点 |
四、AspectJ通知注解
AspectJ通知注解共有6个,常用5个,引介少用一些。重点:https://www.cnblogs.com/best/p/5736422.html
@Component @Aspect @Before @After //切点 @Pointcut @Around |