Spring入门(二)

目录

一、Spring管理Bean(基于注解)

1.1、Bean实例化

(一)注解创建对象

(二)注解注入对象类型属性(@Autowired、@Resource)

(三)配置文件创建对象、注解注入属性

二、AOP面向切面编程

(一)AOP底层原理

(二)AOP术语

(三)Spring的AOP操作

Aspectj实现AOP(基于xml配置文件)

附:

一、项目结构

二、pom文件


一、Spring管理Bean(基于注解)

1.1、Bean实例化

(一)注解创建对象

1、导入Spring核心jar包(与前一章节相同,不再赘述)

2、创建Service

package com.bird.service;

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

/**
 * @Author:wangqk
 * @Date:2018/11/10 下午5:13
 */
@Component(value = "userService")
@Scope(value = "singleton")
public class UserService {
    void show() {
        System.out.println("show service ... ");
    }
}

3、创建Spring配置文件

<?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.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    <!-- 开启注解扫描:在包中扫描类、属性、方法上是否存在注解 -->
    <context:component-scan base-package="com.bird.service"/>
</beans>

4、单元测试

package com.bird.service;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @Author:wangqk
 * @Date:2018/11/10 下午5:23
 */
public class UserServiceTest {
    @Test
    public void test() {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserService userService = (UserService) context.getBean("userService");
        userService.show();
    }
}

(二)注解注入对象类型属性(@Autowired、@Resource)

1、创建Dao

package com.bird.dao;

import org.springframework.stereotype.Component;

/**
 * @Author:wangqk
 * @Date:2018/11/10 下午5:32
 */
@Component(value = "userDao")
public class UserDao {
    public void show() {
        System.out.println("show dao ... ");
    }
}

2、创建Service

package com.bird.service;

import com.bird.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @Author:wangqk
 * @Date:2018/11/10 下午5:13
 */
@Service(value = "userService")
public class UserService {
    // 注解完成对象类型的属性注入
    @Autowired
    private UserDao userDao;

    void show() {
        System.out.println("show service ... ");
        userDao.show();
    }
}
package com.bird.service;

import com.bird.dao.UserDao;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

/**
 * @Author:wangqk
 * @Date:2018/11/10 下午5:13
 */
@Service(value = "userService")
public class UserService {
    // 注解完成对象类型的属性注入
    // name属性值为注解创建对象的value值
    @Resource(name = "userDao")
    private UserDao userDao;

    void show() {
        System.out.println("show service ... ");
        userDao.show();
    }
}

3、创建Spring配置文件

<?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.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    <!-- 开启注解扫描:在包中扫描类、属性、方法上是否存在注解 -->
    <context:component-scan base-package="com.bird"/>
</beans>

4、单元测试

package com.bird.service;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @Author:wangqk
 * @Date:2018/11/10 下午5:23
 */
public class UserServiceTest {
    @Test
    public void test() {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserService userService = (UserService) context.getBean("userService");
        userService.show();
    }
}

(三)配置文件创建对象、注解注入属性

二、AOP面向切面编程

(一)AOP底层原理

动态代理实现AOP的横向抽取机制:

  1. 有接口时,创建接口实现类的代理对象(JDKProxy);
  2. 没有接口时,创建子类的代理对象(CGLibProxy),在子类中调用父类方法实现增强;

JDKProxy返回目标类的代理对象,是目标类所实现接口的另一实现;

CGLibProxy返回目标类的子类;

(二)AOP术语

  1. 连接点:类中可被增强的方法;
  2. 切入点:实际增强的方法;
  3. 增强:拦截到方法后所要做的事情(增强的逻辑);
  4. 切面:将增强应用到切入点的过程;

增强的分类:

  • 前置增强:增强在方法之前执行;
  • 后置增强:增强在方法之后执行;
  • 异常增强:增强在方法出现异常时执行;
  • 最终增强:增强在后置增强之后执行;
  • 环绕增强:增强在方法之前和之后执行;

(三)Spring的AOP操作

Aspectj实现AOP(基于xml配置文件)

1、导入jar包

2、创建基本类

package com.bird.service;

/**
 * @Author:wangqk
 * @Date:2018/11/10 下午5:13
 */
public class UserService {

    void show() {
        System.out.println("show service ... ");
    }
}

3、创建增强类

package com.bird.service;

import org.aspectj.lang.ProceedingJoinPoint;

/**
 * @Author:wangqk
 * @Date:2018/11/10 下午6:19
 */
public class AOPService {
    /**
     * 前置增强
     */
    public void before() {
        System.out.println("before ... ");
    }

    /**
     * 后置增强
     */
    public void after() {
        System.out.println("after ... ");
    }

    /**
     * 环绕增强
     *
     * @param proceedingJoinPoint
     * @throws Throwable
     */
    public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        System.out.println("方法执行之前");
        proceedingJoinPoint.proceed();
        System.out.println("方法执行之后");
    }
}

4、创建Spring配置文件

<?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"
       xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">

    <!-- 创建对象 -->
    <bean id="userService" class="com.bird.service.UserService"/>
    <bean id="aopService" class="com.bird.service.AOPService"/>

    <!-- 配置AOP -->
    <aop:config>
        <!-- 切入点 -->
        <aop:pointcut id="service" expression="execution(* com.bird.service.UserService.show(..))"/>

        <!-- 切面 -->
        <aop:aspect ref="aopService">
            <!-- 增强类型:method为增强类中定义的方法名 -->
            <aop:before method="before" pointcut-ref="service"/>
            <aop:after method="after" pointcut-ref="service"/>
            <aop:around method="around" pointcut-ref="service"/>
        </aop:aspect>
    </aop:config>
</beans>

附:

一、项目结构

二、pom文件

<?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>bird</groupId>
    <artifactId>bird</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <junit.version>4.12</junit.version>
        <spring.version>4.3.9.RELEASE</spring.version>
        <commons-logging.version>1.2</commons-logging.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>

        <!--添加Spring依赖的jar包-->
        <!--依赖注入包-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <!--切片包-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <!--Beans包-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <!--容器包-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <!--核心包-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <!--表达式包-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-expression</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <!--Spring依赖commons-logging包-->
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>${commons-logging.version}</version>
        </dependency>
    </dependencies>

</project>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值