美文网首页Java&Spring基础技术Java学习笔记征服Spring
朝花夕拾之Spring Framework-AOP+IoC(Ja

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

作者: Tony_HQ | 来源:发表于2016-10-18 21:42 被阅读252次

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

    相关文章

      网友评论

      • 阿呆少爷:代码可以放到github上吗?如果有一个可以跑的例子,会更有体感一些😀

      本文标题:朝花夕拾之Spring Framework-AOP+IoC(Ja

      本文链接:https://www.haomeiwen.com/subject/okzayttx.html