您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 招聘面试 > spring02笔记
第1章Spring_day021.1今日内容IOC的注解AOP的XML的方式1.2Spring的Bean管理的注解方式1.2.1IOC注解的快速入门1.2.1.1创建web工程,引入jar包1.2.1.2创建相关的包和类1.2.1.3引入配置文件,引入约束beansxmlns=:xsi=:context=:schemaLocation=://://://配置包的扫描!--Spring的包的扫描:扫描这个包的下的所有类,看那些类上有对应的注解,就会生成这个类的实例--context:component-scanbase-package=com.itheima.spring.demo1/context:component-scan1.2.1.5在相应的类上添加注解@Component(userDao)相当于在Spring的配置文件中配置beanid=”userDao”class=”xxx.UserDaoImpl”1.2.1.6引入AOP的开发包Spring的IOC的注解需要引入AOP的包在Spring的4个版本中的要求。1.2.1.7编写测试类:@Test/***SPring的IOC的注解方式*/publicvoiddemo2(){ApplicationContextapplicationContext=newClassPathXmlApplicationContext(applicationContext.xml);UserDaouserDao=(UserDao)applicationContext.getBean(userDao);userDao.sayHello();}1.2.2Spring的Bean管理的注解详解1.2.2.1@Component:组件@Component这是一个修饰类的注解。Spring看类上是否有该注解,如果有该注解,生成这个类的实例。其实这个注解描述EE开发的三层结构的时候,不是特别清晰。所以Spring提供了三个衍生注解。三个衍生注解功能目前与@Component一致。为了后续的版本中进行增强的。三个衍生注解如下:@Controller:修饰WEB层类@Service:修饰业务层类@Repository:修饰DAO层类1.2.2.2属性注入的注解@Value:普通类型(String和基本数据类)使用@Value注解修饰,如果使用了属性注入的注解,类中的属性可以不需要提供set方法,但如果提供了set方法,注解要加在set方法上。@Autowired:对象类型(类,对象)使用@Autowired注解。如果使用@Autowired默认是按照类型进行属性注入的。但是开发中习惯使用按名称进行属性注入。必须使用@Autowired和@Qulifer注解一起使用。其实还有一个注解@Resource注解,这个注解其实不是Spring框架提供的,制定标准的组织提供的一个注解,Spring符合这个标准的规范。1.2.3Spring的Bean管理的其他的注解1.2.3.1Bean的作用范围的注解@Scope注解用来描述类的作用范围的,默认值singleton。如果配置成多例的使用prototype。1.2.3.2Bean的生命周期相关方法@PostConstruct和@PreDestroy分别代表类被初始化的时候执行的方法和类被销毁的时候执行的方法。这两个注解不是经常使用。1.2.4Spring的XML和注解开发的比较XML:结构更加清晰,维护方便。适合范围广。注解:开发便捷,进行属性注入的时候不需要set方法。适用范围自定义类。1.2.5XML和注解的整合开发XML管理类的时候很方便注解属性注入的时候很方便!--开启Spring的属性的注解可以生效了@Resource@Autowired@PreDestroy...--context:annotation-config/beanid=productServiceclass=com.itheima.spring.demo4.ProductServiceImpl/beanbeanid=productDaoclass=com.itheima.spring.demo4.ProductDaoImpl/beanbeanid=orderDaoclass=com.itheima.spring.demo4.OrderDaoImpl/bean1.3Spring的AOP开发1.3.1AOP的概述1.3.1.1AOP的概念AOP:面向切面编程。AOP出现是OOP的延伸,是OOP的扩展。解决OOP中的一些问题。AOP取代传统的纵向继承体系,采用横向抽取机制。1.3.1.2AOP的底层实现原理代理机制(代理可以增强)Spring实现AOP使用两种代理机制:*JDK动态代理:缺陷:必须实现接口,否则不能产生代理对象*Cglib动态代理:第三方代理机制,采用字节码增强技术,其实是产生了类的子类对象1.3.2AOP的底层实现1.3.2.1JDK实现代理(了解)publicclassMyJdkProxyimplementsInvocationHandler{privateUserDaouserDao;publicMyJdkProxy(UserDaouserDao){this.userDao=userDao;}publicUserDaocreateProxy(){UserDaoproxy=(UserDao)Proxy.newProxyInstance(userDao.getClass().getClassLoader(),userDao.getClass().getInterfaces(),this);returnproxy;}@OverridepublicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable{if(save.equals(method.getName())){System.out.println(权限校验===============);returnmethod.invoke(userDao,args);}returnmethod.invoke(userDao,args);}}1.3.2.2Cglib实现代理(了解)第三方的代理机制,对没有实现接口的类产生代理,使用的是字节码的增强技术,其实就是产生这个类的子类。publicclassMyCglibProxyimplementsMethodInterceptor{privateCustomerDaocustomerDao;publicMyCglibProxy(CustomerDaocustomerDao){this.customerDao=customerDao;}publicCustomerDaocreateProxy(){//创建Cglib的核心类Enhancerenhancer=newEnhancer();//设置父类enhancer.setSuperclass(CustomerDao.class);//设置回调enhancer.setCallback(this);//生成代理CustomerDaoproxy=(CustomerDao)enhancer.create();returnproxy;}@OverridepublicObjectintercept(Objectproxy,Methodmethod,Object[]args,MethodProxymethodProxy)throwsThrowable{if(save.equals(method.getName())){System.out.println(权限校验======================);returnmethodProxy.invokeSuper(proxy,args);}returnmethodProxy.invokeSuper(proxy,args);}}1.3.3Spring的AOP的开发1.3.3.1AOP开发中的术语1.3.3.2Spring使用AspectJ的方式(XML方式)AspectJ:本身就是一个面向切面的框架,Spring把AspectJ引入进来作为自身AOP的开发。【步骤一:引入jar包】引入aop联盟的包spring的aop开发包aspectj的开发包spring整合aspectJ的包【步骤二:编写类】【步骤三:引入Spring的配置文件】引入了aop的约束?xmlversion=1.0encoding=UTF-8?beansxmlns=:xsi=:aop=:schemaLocation=://://://【步骤四:将类交给Spring】!--目标类:--beanid=linkManDaoclass=com.itheima.spring.demo3.LinkManDaoImpl/bean【步骤五:AspectJ中的通知类型】前置通知:在目标方法执行之前执行。后置通知:在目标方法执行之后执行。环绕通知:在目标方法执行之前和之后执行。阻止目标方法的执行。异常抛出通知:在目标方法执行出现异常的时候执行。最终通知:无路目标方法是否出现异常,最终通知总是会被执行。引介通知【步骤六:切入点表达式的编写】AspectJ中提供了切入点的表达式,用来指定哪些包下的哪些类需要被增强。表达式基于execution函数完成的,execution(“切入点表达式”)。表达式语法:[方法的访问修饰符]方法的返回值包名.类名.方法名(参数)1publicvoidcom.itheima.spring.dao.*Dao.save(..)2voidcom.itheima.spring.dao.UserDao.save(..)3*com.itheima.spring.dao.*.*(..)4*com.itheima.spring.dao.UserDao+.*(..)5*com.itheima.spring.dao..*Dao.*(..)【步骤七:编写切面类】publicclassMyAspectXml{publicvoidprivilegeCheck(){System.out.println(权限校验===========);}
本文标题:spring02笔记
链接地址:https://www.777doc.com/doc-5317515 .html