Java&Spring基础技术Java学习笔记征服Spring

朝花夕拾之Spring Framework-AOP+IoC(Ja

2016-10-18  本文已影响252人  Tony_HQ

博主明日就要利用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

上一篇下一篇

猜你喜欢

热点阅读