博主明日就要利用Java,所以暂且放下别的,复习一下Spring framework的 AOP +IoC配置与遇到的小问题。
以往楼主用的是Eclipse,可惜STS在Mac OS上分辨率太差劲,后来用了JetBrains全家福...安利一下。
这篇绝对是互联网上最好找的有关Spring Framework (注解配置)的文章,博主很不喜欢使用XML配置!苦读官方文档+各类博客,总结+过往经验=如下实践。
稍后博主将陆续复习一下,Spring MVC,MyBatis(博主更喜欢简单租宝的JDBCTemplate!)。
先上Maven的配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>info.jufou</groupId>
<artifactId>spring</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
//spring framework 顾名思义
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.3.RELEASE</version>
</dependency>
//Spring AOP 比较难用,Aspectj
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.9</version>
</dependency>
//Spring AOP 比较难用,Aspectj 依赖库,用以织入
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.9</version>
</dependency>
//Aspectj 依赖库
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.2.4</version>
</dependency>
//Aspectj 依赖库
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>1.8.9</version>
</dependency>
//Aspectj spring 兼容库
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>4.3.3.RELEASE</version>
</dependency>
</dependencies>
</project>
博主不喜欢使用XML做配置,全用注解。
IoC
接口
public interface UserServiceI{
public String getUserNickname();
}
实现
@Component
@Scope(scopeName="singleton")//默认就是单例,多例prototype
public class UserService implements UserServiceI {
public UserService(){
System.out.println("I am Created");
}
public String getUserNickname() {
return "Hello";
}
}
调用
@Component
public class UserController {
@Autowired
private UserServiceI userService;
public void printUserNickname(){
System.out.println(userService.getUserNickname());
}
}
Spring 配置
@Configuration
//下二注释是为了aspectj做准备
//@EnableAspectJAutoProxy(proxyTargetClass = true)
//@EnableSpringConfigured
@ComponentScan("jufou.info.*")
public class Application {
public static void main(String[] args) {
ApplicationContext context =
new AnnotationConfigApplicationContext(Application.class);
UserController userController=context.getBean(UserController.class);
userController.printUserNickname();
userController=context.getBean(UserController.class);
userController.printUserNickname();
}
}
到此所谓的控制反转(IoC)就完成了。
下面是AOP
@Aspect
@Component
public class UserInfoLogger {
public UserInfoLogger(){
System.out.println("UserInfoLogger Created");
}
@Pointcut("execution(* jufou.info.impl.UserServiceImpl.getUserNickname())")
private void anyMethod(){
}
@Before("anyMethod()")
public void doAccessCheck(){
System.out.println("前置通知");
}
@AfterReturning("anyMethod()")
public void doAfter(){
System.out.println("后置通知");
}
}
此时在加入Spring 被//掉的两个注解便好。
博主最近主要在做Node.js的开发,都有些不太记得Spring了,没想到Spring framework大法还是如此优秀!清亮简单。
下面是遇到的几个小Bug。记录一下。
@EnableAsync annotation metadata was not injected
原因为
@ComponentScan()
扫描范围过大。
修改为
@ComponentScan("./*")
@Aspect
@Component
需要配合着用,否则spring framework 扫描不出
0 *formal* *unbound* *in* *pointcut*
传参数失败!需要提交args