欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring的IOC和AOP的基本使用

程序员文章站 2022-07-12 13:09:35
...

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}指版本
Spring的IOC和AOP的基本使用

第二步:建立bean对应的实体
Spring的IOC和AOP的基本使用

接口Ink
Spring的IOC和AOP的基本使用

实现类BlackInk
Spring的IOC和AOP的基本使用

实现类Color
Spring的IOC和AOP的基本使用

接口Page
Spring的IOC和AOP的基本使用

实现类A4Page
Spring的IOC和AOP的基本使用

打印机类: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的IOC和AOP的基本使用
引入命名空间(这个直接建立一个Spring的配置文件就会有)
Spring的IOC和AOP的基本使用

配置bean实体 这里是比较复杂的类型
(如果这些实体有属性的话可以使用value来设置值,这里不用管)
Spring的IOC和AOP的基本使用

使用设置注入配置实体
Spring的IOC和AOP的基本使用此外,还有另外一种方式,通过构造注入配置实体

Spring的IOC和AOP的基本使用

现在贴出完整的配置文件(包含上面的还有注入的部分,注入的部分不用管)

<?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("打印内容");
    }
}

第五步:运行看结果 有异常,不用慌,调一调总能出来的

Spring的IOC和AOP的基本使用
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
引入命名空间
Spring的IOC和AOP的基本使用
配置增强方法所在的bean

Spring的IOC和AOP的基本使用

配置切面

 <!--第三步:配置切面-->
    <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">-->
<!--        &lt;!&ndash;使用ref属性配置ink属性 实现对ink的注入&ndash;&gt;-->
<!--        <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>

第四步:运行测试方法得到结果 就是运行一开始的类

Spring的IOC和AOP的基本使用好了,到这里就结束了,这里只是IOC和AOP的使用的一个点,里面的标签你可能不懂,这个就去看Spring的官方Api了,不是中文,翻译一下可以就着用的。
里面的配置的标签如果不懂的话可以百度或看官方文档了。
学框架的话可以先学mybatis的,它的官方文档可以选中文的,而且较为简单,工具的话建议idea。
好了,有什么错误的话帮忙评论中指出。