目录
(二)注解注入对象类型属性(@Autowired、@Resource)
一、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的横向抽取机制:
- 有接口时,创建接口实现类的代理对象(JDKProxy);
- 没有接口时,创建子类的代理对象(CGLibProxy),在子类中调用父类方法实现增强;
JDKProxy返回目标类的代理对象,是目标类所实现接口的另一实现;
CGLibProxy返回目标类的子类;
(二)AOP术语
- 连接点:类中可被增强的方法;
- 切入点:实际增强的方法;
- 增强:拦截到方法后所要做的事情(增强的逻辑);
- 切面:将增强应用到切入点的过程;
增强的分类:
- 前置增强:增强在方法之前执行;
- 后置增强:增强在方法之后执行;
- 异常增强:增强在方法出现异常时执行;
- 最终增强:增强在后置增强之后执行;
- 环绕增强:增强在方法之前和之后执行;
(三)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>