一、IOC的注解开发
1、注解开发使用步骤:
(1)引入jar包
(2)创建配置文件
- log4j.properties
- applicationContext.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- 引入约束 -->
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>
(3)创建相关包和类
(4)将类的控制权交给Spring容器
开启IOC注解:
<!-- 配置组件扫描 -->
<context:component-scan base-package="com.wasion.service" />
在类上添加注解:
(5)编写测试类
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class Demo2 {
@Test
public void demo(){
}
}
(6)依赖注入
2、注解详解
(1)Bean定义注解
XML方式:将id和类绑定
<bean id="UserServiceImpl" class="com.wasion.service.serviceImpl.UserServiceImpl" />
注解方式:只需要在类上添加注解即可
- @Component :组件
- @Controller :修饰web层类
- @Service :修饰业务层类
- @Repository :修饰持久层类
@Component是Spring提供的通用的组件注解,可以通过在类上使用该注解,将对应的类标记为Spring Bean,使用此功能需要在Spring配置文件中,开启组件扫描,<context:component-scan base-package="包名"/>。
@Component和@Component("name")的区别在于,前者只能通过Spring的按类型注入依赖,后者还能使用按名注入依赖。
@Controller、@Service和@Repository这三个注解和@Component的功能在目前的4.x.x版本都是一样的,只是表明它是一个组件。不过通过在不同层使用相对应的注解,可以使注解更具有意义。在以后的版本中,Spring可能提供对这三个注解不同的增强。强化分层思想
(2)Bean依赖注入注解
普通类型的属性
@Value
:注入普通类型属性- 如果属性有set方法,注解需要加到set方法上,如果没有set方法直接在属性上添加注解。
对象类型的属性
@Resource
:注入对象类型@Autowired
:注入对象类型,默认按照类型注入。结合@Qualifier
注解完成按名称的注入。@Qualifier
(3) Bean的作用范围注解
Bean的范围的注解:默认是单例的
- @Scope :在类上添加的,控制类生成的时候采用单例还是多例。
- singleton :单例(默认)
- globalsession 集群环境的session域,需要在web环境
- application: context域,需要在web环境
- session :session域,需要在web环境
- request :request域,需要在web环境
- prototype :多例
PS:可以到WebApplicationContext接口和ConfigurableBeanFactory类中找到@Scope的取值。
(4)Bean的生命周期注解
Bean的生命周期的注解
@PostConstruct
:相当于init-method@PreDestroy
:相当于destroy-method
3、Spring的IOC的XML方式与注解方式比较
4、context:componet-scan和context:annotation-config的区别
通过<context:annotation-config>的注释可以看出它的作用是激活
@Required、@Autowired、@PostConstruct、@PreDestroy、@Resource等注解。
通过<context:component-scan base-package="xx"/>的注释可以看出它除了激活了<context:annotation-config>中所有的注解,同时还激活了@Component、@Repository、@Service、@Controller、 @RestController、@ControllerAdvice、@Configuration 这些注解。
二、AOP的XML开发
1、JDK动态代理
(1)创建接口
(2)接口实现类
import com.wasion.service.ServiceTest;
import org.springframework.stereotype.Service;
@Service("serviceTest")
public class ServiceImpl implements ServiceTest {
@Override
public void save() {
System.out.println("保存...");
}
@Override
public void delete() {
System.out.println("删除...");
}
@Override
public void update() {
System.out.println("修改...");
}
@Override
public void find() {
System.out.println("查找...");
}
}
(3)自定义代理
public class JDKProxy implements InvocationHandler {
private ServiceTest serviceTest;
public JDKProxy(ServiceTest serviceTest){
this.serviceTest = serviceTest;
}
public ServiceTest creatProxy(){
ServiceTest service = (ServiceTest) Proxy.newProxyInstance(serviceTest.getClass().getClassLoader(),
serviceTest.getClass().getInterfaces(),this);
return service;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if("save".equals(method.getName())){
System.out.println("权限校验...");
return method.invoke(serviceTest,args);
}
return method.invoke(serviceTest,args);
}
}
(4)编写测试类
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class Demo4 {
@Resource(name = "serviceTest")
private ServiceTest service;
@Test
public void test(){
ServiceTest proxy = new JDKProxy(service).creatProxy();
proxy.delete();
proxy.update();
proxy.find();
proxy.save();
}
}
2、AOP相关术语
3、通过AOP配置产生动态代理
(1)创建web项目,引入jar包
(2)引入Spring约束
<?xml version="1.0" encoding="ISO-8859-1"?>
<!--引入约束-->
<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">
<context:component-scan base-package="com.wasion.service" />
<bean id="MyAspect" class="com.wasion.proxy.MyAspectXML" />
</beans>
(3)编写目标类
(4)编写测试类
(5)编写切面类
public class MyAspectXML {
public void checkPri(){
System.out.println("权限校验。。。");
}
}
(6)通过AOP配置对目标类产生代理
结果:
4、Spring的切入点表达式写法
- 基于excution函数完成的
- [访问修饰符] 方法返回值 包名.类名.方法名(参数)
- public void com.wasion.service.serviceImpl.ProductServiceImpl.save(..)
可用*占位表示任意的