Spring入门 (4)

        3. Spring整合Web项目
          * 引入spring-web-4.2.4.RELEASE.jar包
          * 配置监听器
          <!-- 配置Spring的核心监听器: -->
          <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
          </listener>
          <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:applicationContext.xml</param-value>
          </context-param>

        4. 修改servlet的代码
          * 从ServletContext中获得工厂
          * 具体代码如下
          ServletContext servletContext = ServletActionContext.getServletContext();
          // 需要使用WEB的工厂的方式
          WebApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(servletContext);
          CustomerService cs = (CustomerService) context.getBean("customerService");
          cs.save();

      h.注解方式实现上述功能

        1.下载导入相应jar包

        2.配置文件

          引入约束(引入context的约束):

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation=" http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context/spring-context.xsd">

</beans>

        3.配置注解扫描

          <!-- Spring的注解开发:组件扫描(类上注解: 可以直接使用属性注入的注解) -->

          <context:component-scan base-package="com.spring.demo1"/>

        4.添加类的注解

            @Component(value="userDao")

public class UserDaoImpl implements UserDao {

@Override

public void sayHello() {

System.out.println("Hello Spring Annotation...");

}

}

        5.测试

            @Test

public void demo2() {

ApplicationContext applicationContext = new ClassPathXmlApplicationContext(

"applicationContext.xml");

UserDao userDao = (UserDao) applicationContext.getBean("userDao");

userDao.sayHello();

}

        6.注解说明

          (1)Spring中提供@Component的三个衍生注解:(功能目前来讲是一致的)

* @Controller   :WEB层

* @Service       :业务层

* @Repository   :持久层

          (2)属性注入的注解:(使用注解注入的方式,可以不用提供set方法.)

@Value:用于注入普通类型.

@Autowired:自动装配:

* 默认按类型进行装配.

* 按名称注入:

* @Qualifier:强制使用名称注入.

@Resource相当于:

* @Autowired和@Qualifier一起使用.

              

Spring入门

 

  (2)AOP面向切面

     a.概述

        Aspect Oriented Programming的缩写,面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。

        AOP是OOP的延续,是软件开发的一个热点,也是Spring的一个重要内容,是函数式编程的一种衍生泛型。利用AOP可以对业务逻辑的各个部分

      进行隔离,从而减低耦合度,提高程序的可重用性,提高开发效率。

     b.特点

        * 不修改源码的情况下对程序进行增强;

        * 可以进行权限校验,日志记录,性能监控,事务控制

        * 由AOP联盟提出,并制定规范,Spring将AOP引入框架中必须遵守AOP联盟规范

     c.底层实现(Spring的AOP底层用到了两种代理机制)

        * JDK的动态代理:针对实现了接口的类产生代理

        * CGLIB的动态代理:针对没有实现接口的类产生代理,应用的是底层的字节码增强技术,生成的是当前类的子类对象

 

      1.JDK动态代理增强一个类中的方法

        public class MyJDKProxy implements InvacationHandler{

          private UserDao userDao;

          public MyJDKProxy (UserDao userDao){

            this.userDao = userDao;

          }

 

          //编写工具方法:生成代理

          public UserDao createProxy(){

            Userdao userDaoProxy = (UserDao) Proxy.newProxyInstance(userDao.getClass().getClassLoader(), 

                userDao.getClass().getInterfaces(), this);

            

            return userDaoProxy;

          }

 

          @override

          public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{

            if("save".equals(method.getName())){

              System.out.println("权限校验==========");

            }

            return method.invoke(uerDao, args);

          }

        }

      2.CGLIB动态代理增强一个类中的方法

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyydyj.html