Spring中AOP的静态代理实现:
在我们的项目中会有日志记录和权限管理及其他与业务逻辑无关的内容,这些我们需要抽取到单独得模块去处理这些内容!
下面是AOP的静态代理实现,AOP图解;
用日志的例子来说明,下面我们先创建一个专门记录日志的类:
- package com.spring.log;
- import java.util.Date;
- /**
- * 日志
- * @author sunlight
- *
- */
- public class Logger {
- public static void info(String info){
- //此处编辑日志输出内容
- System.out.println(new Date()+"===========>>"+info);
- }
- }
package com.spring.log;
import java.util.Date;
/**
* 日志
* @author sunlight
*
*/
public class Logger {
public static void info(String info){
//此处编辑日志输出内容
System.out.println(new Date()+"===========>>"+info);
}
}
我们在执行数据库操作的时候添加日志记录,编写一个User的静态代理的Dao类并实现IUserDao接口,代码如下:
- package com.spring.dao;
- import javax.annotation.Resource;
- import org.springframework.stereotype.Component;
- import com.spring.log.Logger;
- import com.spring.model.User;
- /**
- * 在没有源代码的情况或者权限控制及部分开放 代理类
- *
- * @author sunlight
- *
- */
- @Component("userProxyDao")
- public class UserProxyDao implements IUserDao {
- private IUserDao userDao;
- public IUserDao getUserDao() {
- return userDao;
- }
- @Resource
- public void setUserDao(IUserDao userDao) {
- this.userDao = userDao;
- }
- @Override
- public void add(User user) {
- // 不破坏原来的代码
- Logger.info("添加了用户");
- userDao.add(user);
- }
- @Override
- public void delete(int id) {
- Logger.info("删除了用户");
- userDao.delete(id);
- }
- @Override
- public User load(int id) {
- return null;
- }
- }
package com.spring.dao;
import javax.annotation.Resource;
import org.springframework.stereotype.Component;
import com.spring.log.Logger;
import com.spring.model.User;
/**
* 在没有源代码的情况或者权限控制及部分开放 代理类
*
* @author sunlight
*
*/
@Component("userProxyDao")
public class UserProxyDao implements IUserDao {
private IUserDao userDao;
public IUserDao getUserDao() {
return userDao;
}
@Resource
public void setUserDao(IUserDao userDao) {
this.userDao = userDao;
}
@Override
public void add(User user) {
// 不破坏原来的代码
Logger.info("添加了用户");
userDao.add(user);
}
@Override
public void delete(int id) {
Logger.info("删除了用户");
userDao.delete(id);
}
@Override
public User load(int id) {
return null;
}
}
在Service处注入时,我们使用静态代理的UserProxyDao注入,代码如下:
- package com.spring.service;
- import javax.annotation.Resource;
- import org.springframework.stereotype.Component;
- import org.springframework.stereotype.Service;
- import com.spring.dao.IUserDao;
- import com.spring.model.User;
- //@Component(value="userService")
- @Service("userService") //业务层一般用@Service注入
- public class UserService implements IUserService {
- private IUserDao userDao;
- public IUserDao getUserDao() {
- return userDao;
- }
- //默认通过名称注入,在JSR330中提供了@Inject来注入
- @Resource(name="userProxyDao") //此处用代理类注入
- public void setUserDao(IUserDao userDao) {
- this.userDao = userDao;
- }
- @Override
- public void add(User user) {
- userDao.add(user);
- }
- @Override
- public void delete(int id) {
- userDao.delete(id);
- }
- @Override
- public User load(int id) {
- return userDao.load(id);
- }
- }
package com.spring.service;
import javax.annotation.Resource;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import com.spring.dao.IUserDao;
import com.spring.model.User;
//@Component(value="userService")
@Service("userService") //业务层一般用@Service注入
public class UserService implements IUserService {
private IUserDao userDao;
public IUserDao getUserDao() {
return userDao;
}
//默认通过名称注入,在JSR330中提供了@Inject来注入
@Resource(name="userProxyDao") //此处用代理类注入
public void setUserDao(IUserDao userDao) {
this.userDao = userDao;
}
@Override
public void add(User user) {
userDao.add(user);
}
@Override
public void delete(int id) {
userDao.delete(id);
}
@Override
public User load(int id) {
return userDao.load(id);
}
}
其他代码详见: Spring中IOC的Annotation实现
执行结果: