Spring框架切面编程

本文介绍 Spring 框架中 AOP (面向切面编程) 的使用方法及实战案例,通过具体代码示例展示了如何在不改动原有代码的情况下,横向添加新功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*****************************************************************************************************/ 
10:48 2017/10/19      静态切面编程
/*****************************************************************************************************/ 
·对于Spring框架,每一层都有专门的注解:
    |-:DAO层专门的注解是:@Repository
    |-:Service层专门的注解是:@Service
    |-: Action层专门的注解是:@Controller
·Spring中的切面编程(AOP)
    添加新功能,但是源码不让动。一种思想,在不动原先代码的基础上,横向的加入新的代码。     
·如果要添加一个日志,那么就写一个类,把类里面的东西添加到日志里面。    
  然后再写一个Dao:UserInfoDao,实现同一个接口。
  所以用接口,继承接口就可以实现在不动原先代码的基础上,横向的加入新的代码。  
  原先的代码不可以动,但是注解可以动。
·范例:
    (1)、Action层:
      package com.wk.action;
      import javax.annotation.Resource;


      import org.springframework.context.annotation.Scope;
      import org.springframework.stereotype.Component;
      import org.springframework.stereotype.Controller;


      import com.wk.model.user;
      import com.wk.service.impl.IUserService;


      /**
       * 完成与界面层的传值和跳转
       * 负责与页面的传值和跳转。
       * @author dellpc
       *
       */
      //@Component("userAction")
      @Controller("Action")
      @Scope("prototype")//表示多例


      public class Action{
       private user user;
       private int id;
       private IUserService userService;
       
public Action() {
super();
}

public Action(IUserService userService) {
super();
this.userService = userService;
}


public IUserService getUserService() {
return userService;
}
//依赖注入的注解形式:<property name="userService" ref = "userService"></property>
@Resource
public void setUserService(IUserService userService) {
this.userService = userService;
}
public user getUser() {
return user;
}
public void setUser(user user) {
this.user = user;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
    public void add(){
    userService.add(user);
    }
    public void delete(){
    userService.delete(id);
    }
       
   }
   (2)、AOP类:
    package com.wk.aop;


      public class Info {
       public static  void info(String msg){
            System.out.println(msg+"进行了操作");
       }
}  
   (3)、Dao类;
     package com.wk.dao;


    import org.springframework.context.annotation.Scope;
    import org.springframework.stereotype.Component;
    import org.springframework.stereotype.Repository;


    import com.wk.dao.impl.IUserDao;
    import com.wk.model.user;


    //相当于<bean id="UserDao" class=""/>
    //@Component("userDao")
    @Repository("UserDao")  //配置文件中Id的值
    public class UserDao implements IUserDao{


@Override
public void add(user user) {
// TODO Auto-generated method stub
System.out.println("添加一个用户"+user.getUsername());
}


@Override
public void delete(int id) {
// TODO Auto-generated method stub
System.out.println("删除一个用户"); 
}


@Override
public user load(int id) {
// TODO Auto-generated method stub
    System.out.println("查询一个用户");
return null;
}


@Override
public void update(user user) {
// TODO Auto-generated method stub
System.out.println("修改一个用户");
}
    


}
   (4)、要额外添加功能就在写一个类,且跟原先的dao类继承同一个接口。
       package com.wk.dao;


       import javax.annotation.Resource;


       import org.springframework.stereotype.Repository;


       import com.wk.aop.Info;
       import com.wk.dao.impl.IUserDao;
       import com.wk.model.user;  
       @Repository("UserInfoDao")
       public class UserInfoDao implements IUserDao{
         private UserDao userDao;
    
public UserDao getUserDao() {
return userDao;
}
    @Resource
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}


@Override
public void add(user user) {
// TODO Auto-generated method stub
Info.info("张三"+"2017.11.2");
userDao.add(user);
}


@Override
public void delete(int id) {
// TODO Auto-generated method stub

}


@Override
public user load(int id) {
// TODO Auto-generated method stub
return null;
}


@Override
public void update(user user) {
// TODO Auto-generated method stub

}


}    
     (4)、Dao接口。
       package com.wk.dao.impl;


       import com.wk.model.user;


      public interface IUserDao {
       public void add(user user);
       public void delete(int id);
       public user load(int id);
       public void update(user user);
}
     (5)、user实体类:
       package com.wk.model;


       import org.springframework.context.annotation.Scope;
       import org.springframework.stereotype.Component;


       @Component("user")
       @Scope("prototype")
       public class user {
       private int id;
       private String username;
       private String password;
   
public user() {
super();
}
public user(int id, String username, String password) {
super();
this.id = id;
this.username = username;
this.password = password;
}
  public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}


public String getUsername() {
return username;
}


public void setUsername(String username) {
this.username = username;
}


public String getPassword() {
return password;
}


public void setPassword(String password) {
this.password = password;
}


public void show(){
       System.out.println("hello Spring");
       }
     
}
    (6)、service类:
    package com.wk.service;


import javax.annotation.Resource;


import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;


import com.wk.dao.UserDao;
import com.wk.dao.impl.IUserDao;
import com.wk.model.user;
import com.wk.service.impl.IUserService;
/**
 * 这里的增删改插应该调用dao层的。只是业务逻辑处理的枢纽,具体操作还要靠各个实体类。
 * @author dellpc
 *
 */


//@Component("UserService")
@Service("UserService")
public class UserService implements IUserService{
    private IUserDao userDao;
    
public IUserDao getUserDao() {
return userDao;
}
@Resource(name="UserInfoDao")  //注入了即就是把UserInfoDao对象给了userDao
public void setUserDao(IUserDao userDao) {
this.userDao = userDao;
}


@Override
public void add(user user) {
// TODO Auto-generated method stub
userDao.add(user);
}


@Override
public void delete(int id) {
// TODO Auto-generated method stub
userDao.delete(id);
}


@Override
public user load(int id) {
// TODO Auto-generated method stub
    userDao.load(id);
return null;
}


@Override
public void update(user user) {
// TODO Auto-generated method stub
userDao.update(user);
}


}
     (7)、service接口:
     package com.wk.service.impl;


     import com.wk.model.user;


     /**
      * 处理业务逻辑
      * 以面向接口编程的形式,较为灵活。
      * 1、加密或解密。
      * 2、异常处理。
      * 3、验证码的问题。
      * @author dellpc
      *
      */
     public interface IUserService {
         public void add(user user);
         public void delete(int id);
public user load(int id);
         public void update(user user);

     }


     (8)、测试类:
    package com.wk.test;


import static org.junit.Assert.*;


import org.junit.Test;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;


import com.wk.action.Action;
import com.wk.model.user;


public class TestUser {

@Test
public void test02() {
//加载xml配置文件
BeanFactory factory = new ClassPathXmlApplicationContext("beans.xml");
Action userAction = factory.getBean("Action", Action.class);
user user = new user(1,"张三","123");
userAction.setUser(user);
userAction.add();


Action userAction2 = factory.getBean("Action", Action.class);
    //userAction2.add();
    System.out.println(userAction == userAction2);
}
}
    (9)、beans.xml配置文件
     <?xml version="1.0" encoding="UTF-8"?>
     <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
         http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
         http://www.springframework.org/schema/context
         http://www.springframework.org/schema/context/spring-context-3.0.xsd">
   <!-- 打开注解 --> 
   <context:annotation-config/>
   <!-- 到哪包下找注解 -->
   <context:component-scan base-package="com.wk"></context:component-scan>
</beans>
 注:上述代码实现切面编程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值