1、spring02笔记Spring_day02今日内容 IOC的注解 AOP的XML的方式Spring的Bean管理的注解方式IOC注解的快速入门创建web工程,引入jar包创建相关的包和类引入配置文件,引入约束 配置包的扫描 在相应的类上添加注解Component(userDao) 相当于在Spring的配置文件中配置引入AOP的开发包Spring的IOC的注解需要引入AOP的包在Spring的4个版本中的要求。编写测试类: Test /* * SPring的IOC的注解方式 */ public void demo2() ApplicationContext applicationContex
2、t = new ClassPathXmlApplicationContext(applicationContext.xml); UserDao userDao = (UserDao) applicationContext.getBean(userDao); userDao.sayHello(); Spring的Bean管理的注解详解Component:组件Component这是一个修饰类的注解。Spring看类上是否有该注解,如果有该注解,生成这个类的实例。其实这个注解描述EE开发的三层结构的时候,不是特别清晰。所以Spring提供了三个衍生注解。三个衍生注解功能目前与Component一致。
3、为了后续的版本中进行增强的。三个衍生注解如下: Controller :修饰WEB层类 Service :修饰业务层类 Repository :修饰DAO层类属性注入的注解Value: 普通类型(String和基本数据类)使用Value注解修饰,如果使用了属性注入的注解,类中的属性可以不需要提供set方法,但如果提供了set方法,注解要加在set方法上。Autowired: 对象类型(类,对象)使用Autowired注解。如果使用Autowired默认是按照类型进行属性注入的。但是开发中习惯使用按名称进行属性注入。必须使用Autowired和Qulifer注解一起使用。其实还有一个注解Reso
4、urce注解,这个注解其实不是Spring框架提供的,制定标准的组织提供的一个注解,Spring符合这个标准的规范。Spring的Bean管理的其他的注解Bean的作用范围的注解Scope注解用来描述类的作用范围的,默认值singleton。如果配置成多例的使用prototype。Bean的生命周期相关方法PostConstruct和PreDestroy分别代表类被初始化的时候执行的方法和类被销毁的时候执行的方法。这两个注解不是经常使用。Spring的XML和注解开发的比较XML :结构更加清晰,维护方便。适合范围广。注解:开发便捷,进行属性注入的时候不需要set方法。适用范围自定义类。XML
5、和注解的整合开发XML管理类的时候很方便注解属性注入的时候很方便 Spring的AOP开发AOP的概述AOP的概念AOP:面向切面编程。AOP出现是OOP的延伸,是OOP的扩展。解决OOP中的一些问题。AOP取代传统的纵向继承体系,采用横向抽取机制。AOP的底层实现原理代理机制(代理可以增强)Spring实现AOP使用两种代理机制: * JDK动态代理 :缺陷:必须实现接口,否则不能产生代理对象 * Cglib动态代理 :第三方代理机制,采用字节码增强技术,其实是产生了类的子类对象AOP的底层实现JDK实现代理(了解)public class MyJdkProxy implements Inv
6、ocationHandler private UserDao userDao; public MyJdkProxy(UserDao userDao) this.userDao = userDao; public UserDao createProxy() UserDao proxy = (UserDao) Proxy.newProxyInstance(userDao.getClass().getClassLoader(), userDao.getClass().getInterfaces(), this); return proxy; Override public Object invoke
7、(Object proxy, Method method, Object args) throws Throwable if(save.equals(method.getName() System.out.println(权限校验=); return method.invoke(userDao, args); return method.invoke(userDao, args); Cglib实现代理(了解)第三方的代理机制,对没有实现接口的类产生代理,使用的是字节码的增强技术,其实就是产生这个类的子类。public class MyCglibProxy implements MethodIn
8、terceptor private CustomerDao customerDao; public MyCglibProxy(CustomerDao customerDao) this.customerDao = customerDao; public CustomerDao createProxy() / 创建Cglib的核心类 Enhancer enhancer = new Enhancer(); / 设置父类 enhancer.setSuperclass(CustomerDao.class); / 设置回调 enhancer.setCallback(this); / 生成代理 Custo
9、merDao proxy = (CustomerDao) enhancer.create(); return proxy; Override public Object intercept(Object proxy, Method method, Object args, MethodProxy methodProxy) throws Throwable if(save.equals(method.getName() System.out.println(权限校验=); return methodProxy.invokeSuper(proxy, args); return methodProx
10、y.invokeSuper(proxy, args); Spring的AOP的开发AOP开发中的术语Spring使用AspectJ的方式(XML方式)AspectJ:本身就是一个面向切面的框架,Spring把AspectJ引入进来作为自身AOP的开发。【步骤一:引入jar包】引入aop联盟的包spring的aop开发包aspectj的开发包spring整合aspectJ的包【步骤二:编写类】【步骤三:引入Spring的配置文件】引入了aop的约束 【步骤四:将类交给Spring】 【步骤五:AspectJ中的通知类型】前置通知 :在目标方法执行之前执行。后置通知 :在目标方法执行之后执行。环绕
11、通知 :在目标方法执行之前和之后执行。阻止目标方法的执行。异常抛出通知 :在目标方法执行出现异常的时候执行。最终通知 :无路目标方法是否出现异常,最终通知总是会被执行。引介通知【步骤六:切入点表达式的编写】AspectJ中提供了切入点的表达式,用来指定哪些包下的哪些类需要被增强。表达式基于execution函数完成的,execution(“切入点表达式”)。表达式语法:方法的访问修饰符 方法的返回值 包名.类名.方法名(参数) 1 public void com.itheima.spring.dao.*Dao.save(.) 2 void com.itheima.spring.dao.User
12、Dao.save(.) 3 * com.itheima.spring.dao.*.*(.) 4 * com.itheima.spring.dao.UserDao+.*(.) 5 * com.itheima.spring.dao.*Dao.*(.)【步骤七:编写切面类】public class MyAspectXml public void privilegeCheck() System.out.println(权限校验=); 交给Spring管理: 【步骤八:配置前置增强】 【步骤九:编写测试类】public class SpringDemo3 Test public void demo1()
13、 ApplicationContext applicationContext = new ClassPathXmlApplicationContext(applicationContext.xml); LinkManDao linkManDao = (LinkManDao) applicationContext.getBean(linkManDao); linkManDao.save(); linkManDao.update(); linkManDao.delete(); linkManDao.find(); Spring和Junit整合【引入jar包】spring-test-4.2.4.RE
14、LEASE.jar【编写测试代码】RunWith(SpringJUnit4ClassRunner.class)ContextConfiguration(classpath:applicationContext.xml)public class SpringDemo3 Resource(name=linkManDao) private LinkManDao linkManDao; /* Test public void demo1() ApplicationContext applicationContext = new ClassPathXmlApplicationContext(applic
15、ationContext.xml); LinkManDao linkManDao = (LinkManDao) applicationContext.getBean(linkManDao); linkManDao.save(); linkManDao.update(); linkManDao.delete(); linkManDao.find(); */ Test public void demo2() linkManDao.save(); linkManDao.update(); linkManDao.delete(); linkManDao.find(); Spring的AOP中的通知的详解【前置通知】指的是在目标方法执行之前执行一段增强。前置通知可以获得切入点表达式。【后置通知】指的是在目标方法执行之后执行一段增强。后置通知获得方法的返回值。【环绕通知】指的是在目标方法执行之前和之后进行增强。阻止目标方法执行。【异常抛出通知】指的是在目标方法执行出现异常的时候执行的。获得到异常的信息。【最终通知】指的是无论是否有异常,总是被执行的。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1