Spring的IOC和AOP的基本使用
1.Spring的IOC操作
第一步:配置所需要的jar包即配置pom.xml文件
<!--Spring的IOC需要的jar包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</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-expression</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
${spring.version}指版本
第二步:建立bean对应的实体
接口Ink
实现类BlackInk
实现类Color
接口Page
实现类A4Page
打印机类:Printer
package demo.xianqiao.print;
import demo.xianqiao.ink.Ink;
import demo.xianqiao.page.Page;
/**
* 打印机所在类 打印机由墨盒和纸张组成
*/
public class Printer {
private Ink ink;
private Page page;
public Ink getInk() {
return ink;
}
public void setInk(Ink ink) {
this.ink = ink;
}
public Page getPage() {
return page;
}
public void setPage(Page page) {
this.page = page;
}
public Printer() {
}
public Printer(Ink ink, Page page) {
this.ink = ink;
this.page = page;
}
public void print(String content){
System.out.println("ink:"+ink.getColor());
System.out.println("page:"+page.getStyle());
System.out.println(content);
}
}
第三步:配置配置文件applicationContext.xml
引入命名空间(这个直接建立一个Spring的配置文件就会有)
配置bean实体 这里是比较复杂的类型
(如果这些实体有属性的话可以使用value来设置值,这里不用管)
使用设置注入配置实体
此外,还有另外一种方式,通过构造注入配置实体
现在贴出完整的配置文件(包含上面的还有注入的部分,注入的部分不用管)
<?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: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/aop
https://www.springframework.org/schema/aop/spring-aop.xsd">
<!--配置纸张实体-->
<bean id="page" class="demo.xianqiao.page.Impl.A4Page"></bean>
<!--配置墨盒实体 -->
<bean id="ink" class="demo.xianqiao.ink.Impl.BlackInk"></bean>
<bean id="colorInk" class="demo.xianqiao.ink.Impl.ColorInk"></bean>
<!--配置打印机-->
<!--创建普通bean实体(没有通过构造注入设置属性的时候)的时候依赖于无参构造
所以,使用设置注入还需要无参构造函数-->
<!--设值注入 依赖于setter方法-->
<bean id="printer" class="demo.xianqiao.print.Printer">
<!--使用ref属性配置ink属性 实现对ink的注入-->
<property name="ink" ref="colorInk"></property>
<property name="page">
<ref bean="page" />
</property>
</bean>
<!--构造注入 依赖于构造方法-->
<bean id="printer" class="demo.xianqiao.print.Printer">
<constructor-arg index="0" ref="colorInk"></constructor-arg>
<constructor-arg index="1">
<ref bean="page"></ref>
</constructor-arg>
</bean>
<!--AOP的配置-->
<!--第一步:先在文件最上方引入命名空间-->
<!-- 第二步:声明增强方法所在的Bean-->
<bean id="theLogger" class="demo.xianqiao.aop.PrintLog"></bean>
<!--第三步:配置切面-->
<aop:config>
<!-- 第四步:定义切入点-->
<aop:pointcut id="pointcut" expression="execution(public void print(String))"/>
<!-- 引用包含增强方法的bean 织入-->
<aop:aspect ref="theLogger">
<!-- 将before()方法定义为前置增强并引用pointcut切入点-->
<aop:before method="before" pointcut-ref="pointcut"></aop:before>
<!-- 将afterReturning()方法定义为后置增强并引用pointcut切入点-->
<!-- 通过returning属性指定 为 名为result的参数注入返回值-->
<aop:after-returning method="afterReturning"
pointcut-ref="pointcut" returning="result"></aop:after-returning>
</aop:aspect>
</aop:config>
</beans>
第四步 测试类:
package demo.xianqiao.print;
import org.apache.log4j.Logger;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* 打印机测试类
*/
public class PrinterTest {
private static Logger logger = Logger.getLogger(PrinterTest.class);
@Test
public void testPrint(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
Printer printer = applicationContext.getBean("printer",Printer.class);
printer.print("打印内容");
}
}
第五步:运行看结果 有异常,不用慌,调一调总能出来的
2.Spring的AOP操作
第一步:导入AOP需要的包
<!--Spring的AOP需要的Jar包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.0</version>
</dependency>
<dependency>
<groupId>aopalliance</groupId>
<artifactId>aopalliance</artifactId>
<version>1.0</version>
</dependency>
${spring.version}代指版本 随便选一个就好了,这里是因为配置了全局的,如果不想要这个,直接改为4.3.25.RELEASE
现在贴出完整的pom.xml(里面有很多是idea自动生成的,主要是配jar包,就是dependency,其他基本不用管)
<?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>demo.xianqiao</groupId>
<artifactId>SpringPrinter</artifactId>
<version>1.0-SNAPSHOT</version>
<name>SpringPrinter</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<spring.version>4.3.25.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!--Spring的IOC需要的jar包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</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-expression</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!--Spring的AOP需要的Jar包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.0</version>
</dependency>
<dependency>
<groupId>aopalliance</groupId>
<artifactId>aopalliance</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
<build>
<resources>
<!--编译的时候将java文件也打包进去-->
<resource>
<directory>/src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<!--编译的时候将resources文件包含在内-->
<resource>
<directory>/src/main/resources</directory>
<includes>
<include>**/*.*</include>
</includes>
</resource>
</resources>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
<!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
<plugin>
<artifactId>maven-site-plugin</artifactId>
<version>3.7.1</version>
</plugin>
<plugin>
<artifactId>maven-project-info-reports-plugin</artifactId>
<version>3.0.0</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
第二步:增强方法的编写 即类PrintLog的编写
package demo.xianqiao.aop;
import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import java.util.Arrays;
/**
* 增强类:日志处理
*/
public class PrintLog {
private Logger logger = Logger.getLogger(PrintLog.class);
//JoinPoint链接点类
/**
* 前置增强
* @param jp
*/
public void before(JoinPoint jp){
logger.info("调用目标对象:"+jp.getTarget()+"的链接点名称(方法):"+
jp.getSignature().getName()+"。方法参数"+
Arrays.toString(jp.getArgs()) +"前置增强");
}
public void afterReturning(JoinPoint jp, Object result){
logger.info("调用"+jp.getTarget()+"的"+jp.getSignature().getName()
+"方法。方法返回值:"+result+"后置增强");
}
}
第三步:配置配置文件applicationContext.xml
引入命名空间
配置增强方法所在的bean
配置切面
<!--第三步:配置切面-->
<aop:config>
<!-- 第四步:定义切入点-->
<aop:pointcut id="pointcut" expression="execution(public void print(String))"/>
<!-- 引用包含增强方法的bean 织入-->
<aop:aspect ref="theLogger">
<!-- 将before()方法定义为前置增强并引用pointcut切入点-->
<aop:before method="before" pointcut-ref="pointcut"></aop:before>
<!-- 将afterReturning()方法定义为后置增强并引用pointcut切入点-->
<!-- 通过returning属性指定 为 名为result的参数注入返回值-->
<aop:after-returning method="afterReturning"
pointcut-ref="pointcut" returning="result"></aop:after-returning>
</aop:aspect>
</aop:config>
好了上面是步骤,下面贴出配置文件applicationContext.xml
<?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: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/aop
https://www.springframework.org/schema/aop/spring-aop.xsd">
<!--配置纸张实体-->
<bean id="page" class="demo.xianqiao.page.Impl.A4Page"></bean>
<!--配置墨盒实体 -->
<bean id="ink" class="demo.xianqiao.ink.Impl.BlackInk"></bean>
<bean id="colorInk" class="demo.xianqiao.ink.Impl.ColorInk"></bean>
<!--配置打印机-->
<!--创建普通bean实体(没有通过构造注入设置属性的时候)的时候依赖于无参构造
所以,使用设置注入还需要无参构造函数-->
<!--设值注入 依赖于setter方法-->
<!-- <bean id="printer" class="demo.xianqiao.print.Printer">-->
<!-- <!–使用ref属性配置ink属性 实现对ink的注入–>-->
<!-- <property name="ink" ref="colorInk"></property>-->
<!-- <property name="page">-->
<!-- <ref bean="page" />-->
<!-- </property>-->
<!-- </bean>-->
<!--构造注入 依赖于构造方法-->
<bean id="printer" class="demo.xianqiao.print.Printer">
<constructor-arg index="0" ref="colorInk"></constructor-arg>
<constructor-arg index="1">
<ref bean="page"></ref>
</constructor-arg>
</bean>
<!--AOP的配置-->
<!--第一步:先在文件最上方引入命名空间-->
<!-- 第二步:声明增强方法所在的Bean-->
<bean id="theLogger" class="demo.xianqiao.aop.PrintLog"></bean>
<!--第三步:配置切面-->
<aop:config>
<!-- 第四步:定义切入点-->
<aop:pointcut id="pointcut" expression="execution(public void print(String))"/>
<!-- 引用包含增强方法的bean 织入-->
<aop:aspect ref="theLogger">
<!-- 将before()方法定义为前置增强并引用pointcut切入点-->
<aop:before method="before" pointcut-ref="pointcut"></aop:before>
<!-- 将afterReturning()方法定义为后置增强并引用pointcut切入点-->
<!-- 通过returning属性指定 为 名为result的参数注入返回值-->
<aop:after-returning method="afterReturning"
pointcut-ref="pointcut" returning="result"></aop:after-returning>
</aop:aspect>
</aop:config>
</beans>
第四步:运行测试方法得到结果 就是运行一开始的类
好了,到这里就结束了,这里只是IOC和AOP的使用的一个点,里面的标签你可能不懂,这个就去看Spring的官方Api了,不是中文,翻译一下可以就着用的。
里面的配置的标签如果不懂的话可以百度或看官方文档了。
学框架的话可以先学mybatis的,它的官方文档可以选中文的,而且较为简单,工具的话建议idea。
好了,有什么错误的话帮忙评论中指出。
上一篇: scala之面向对象
下一篇: Spring入门——(二、IOC)