Spring6-IOC-AOP
一、IOC(Inversion of Control,即“控制反转”)
将对对象的管理交SpringIOC容器来管理,实现控制反转;
<?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
">
<!--1.在pom.xml导入Spring坐标-->
<!-- 2.在applicationContext配置bean-->
<!--bean标签标示配置bean
id属性标示给bean起名字
class属性表示给bean定义类型
还可以定义name属性:定义别名
scope属性定义bean的范围:默认是单例的(singleton); 多例模式()-->
<!-- <bean id="bookDao" class="com.guoc.Dao.BookDao" scope="singleton" init-method="init" destroy-method="destory"/>-->
<!--property标签表示配置当前bean的属性
name属性表示配置哪一个具体的属性
ref属性表示参照哪一个bean-->
<!-- !!!!!还可以自动注入autowire,则property属性就不用配置了-->
<!--1.开启context命名空间-->
<!--2.使用context空间加载Properties文件-->
<context:property-placeholder location="classpath*:*.properties"/>
<bean id="bookService" class="com.guoc.Service.impl.BookServiceImpl">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
</beans>
package com.guoc;
import com.guoc.Service.BookService;
import com.guoc.Service.impl.BookServiceImpl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class app01 {
public static void main(String[] args) {
ApplicationContext brandDao = new ClassPathXmlApplicationContext("applicationContext.xml");
//获取Bean,即可调用方法
BookServiceImpl book = (BookServiceImpl) brandDao.getBean("bookService");
book.save();
System.out.println(book.getDriver()+book.getUrl());
}
}
二、AOP
AOP作用:在不改变原始设计的基础上为其进行功能增强, 将不同类的不同方法抽象成一个切面,自动注入执行,减少系统的重复代码,降低模块间的耦合度。
应用场景:安全校验、日志操作、事务操作,缓存,权限、调试,错误处理,同步,持久化数据等等
1.在pom.xml中导入Spring和aspect坐标
<!-- 第1步。导入坐标-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.4</version>
</dependency>
</dependencies>
2.定义对象,声明业务接口,以及实现方法
3.添加Aop配置类的逻辑
package com.guoc.config;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
//@Aspect是将该类声明为切面类,再加@Component 进行Spring管理
@Aspect
@Component
public class AopConfig {
@Pointcut("execution(* com.guoc.dao.bookdao.*(..))")
public void pt(){}
/* @After("pt()")
public void afterMethod(){
System.out.println("after");
}
@Before("pt()")
public void beforeMethod(){
System.out.println("before");
}*/
@Around("pt()")
public Object aroundMethod(ProceedingJoinPoint pjt) throws Throwable {
System.out.println("环绕前");
//若目标方法有返回值,则该方法的返回值就是目标方法的返回值。
Object rtn = pjt.proceed();
System.out.println("环绕后");
System.out.println(rtn.toString());
return rtn;
}
}
输出结果:
环绕前
老人与海
环绕后
老人与海
4.添加Spring配置类,开启注解驱动支持
5.获取Bean调用
package com.guoc;
import com.guoc.config.SpringConfig;
import com.guoc.dao.bookdao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class AOPMain {
public static void main(String[] args) {
//读取上下文空间
ApplicationContext ctx= new AnnotationConfigApplicationContext(SpringConfig.class);
//获取bean
bookdao book=ctx.getBean(bookdao.class);
book.getBook();
}
}
注解
注解
@Component 最普通的组件,可以被注入到spring容器进行管理
@Repository 作用于持久层
@Service 作用于业务层
@Controller 作用于控制层(spring-mvc的注解)