Spring基础[IOC/DIAOP]

Posted Fighting`

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring基础[IOC/DIAOP]相关的知识,希望对你有一定的参考价值。

一、Spring作用:管理项目中各种业务Bean(service类、Dao类、Action类),实例化类,属性赋值

二、Spring IOC(Inversion of Control )控制反转,也被称为依赖注入(Dependency Injection[DI]),是面向对象编程 中的一种设计理念,用来减轻程序代码之间的耦合度。

IOC原理:侧重原理

在业务代码中不使用我们之间司空见惯的关键字new来构建一个业务实例,而是在配置文件中。通过xml节点来告知容器如何对内存中构建的对应类型的对象名称做命名

DI依赖注入:侧重实现

 说的是创建对象实例时,为这个对象注入属性值其它对象实例,侧重于实现。

 两者关系它们是spring核心思想的不同方面的描述。


三、Spring第一个案例[无需new关键字,创建Student对象]

具体步骤:

①创建Student实体类

②在src下创建applicationContext.xml配置文件

③ 测试类

---引入核心jar包:[Beans、Core、Context、Expression]

 

---创建实体类Student 可植入相应的属性值

 

---在src下编写Spring配置文件

头文件查找位置:源码

applicationContext.xml:

注:在spring配置文件中,使用<bean>元素来定义Bean实例(也可称为组件)。有两个常用属性:一个是id,表示定义的Bean实例的名称,另一个是Class,表示定义的Bean实例的类型

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xsi:schemaLocation="
 5         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
 6         
 7         <bean id="stu" class="cn.happy.entity.Student">
 8         <property name="name" value="呵呵"></property>
 9         <property name="age" value="13"></property>
10        
11        </bean>
12        
13         </beans>

 --进行测试Test

通过ClassPathXmlApplicationContext实例化Spring的上下文,并通过ApplicationContext的getBean()方法,根据id来获取Bean实例。ApplicationContext是一个接口,负责读取Spring配置文件,管理对象的加载,生成,维护Bean对象与Bean对象之间的依赖关系,负责Bean的生命周期。ClassPathXmlApplicationContext是ApplicationContext接口的实现类,用于从classpath路径中读取spring配置文件。

 

1 public class Test01 {
2 @Test
3 public void addTest(){
4     ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
5     Student stus=(Student) ctx.getBean("stu");    
6     System.out.println(stus);
7     
8 }

 输出结果:

 


四、依赖注入[DI]

通过不同的纸张和不同类型墨盒的组合,来装配出一台打印机。

 具体步骤:

①分层创建墨盒和纸张接口

②实现类

③在配置文件中装配

 --ink包下创建Ink接口和其实现类

 ink接口:

public interface Ink {
    public String getColor();
}

实现类:

public class ColorInk implements Ink{

    public String getColor() {
        
        return "彩色墨盒";
    }

}
public class BlackInk implements Ink{

    public String getColor() {
        
        return "黑色墨盒";
    }

}

 --在paper包下创建paper接口和其实现类

 paper接口:

public interface Paper {
    public String getContent();
}

实现类: 

public class A4Paper implements Paper{

    public String getContent() {        
        return "我是A4";
    }

}
public class B5Paper implements Paper{
    public String getContent() {
        return "我是B5";
    }

}

--printer包下创建Print类,并植入ink,paper成员变量,称为域属性。封装,以及打印的方法。

public class Print {
    private Ink ink;
    private Paper paper;
    
    public void print(){
        System.out.println(""+ink.getColor()+"打印"+paper.getContent()+"纸张");
    }
    

 --配置文件,并对ink和paper以及打印机进行配置

--测试类。强转的是打印机类print

1 public class SpringTest {
2     @Test
3     public void test1(){
4         ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
5         Print pri=(Print) ctx.getBean("printer");
6         pri.print();
7     }

输出结果:

 


五、Spring AOP[Aspect Oriented Programming] 面向切面编程

AOP原理:

将复杂的需求分解出不同方面,将散布在系统中的公共功能集中解决

采用代理机制组装起来运行,在不改变原程序的基础上对代码段进行增强处理,增加新的功能

AOP目的:

从系统中分离出切面,独立于业务逻辑实现

 

如何使用AOP?

具体步骤:

①在项目中添加Spring AOP相关的JAR文件

②编写前置增强和后置增强实现日志功能

③编写Spring文件,对业务方法进行增强处理

④编写代码获取带有增强处理的业务对象

--添加相关jar文件:

--业务类:并实现特定接口,在该方法中并没有实现日志输出功能

ISomeService:

SomeService:

 

 --接下来就以AOP方式为该方法添加日志功能,编写增强类

通过 MethodBeforeAdvice实现前置增强

通过AfterReturningAdvice实现后置增强

 

--Spring配置文件进行组件声明。

注:头文件需引入对应的aop

--接下来在Spring配置文件中实现Aop配置,首先定义切入点。execution是切入点指示符,它的括号中是一个切入点表达式,可以配置要切入的方法,切入点表达式支持模糊匹配

 

--测试类

标红注意点:

 关于接口的一个问题:

如果一个类实现了一个接口,默认使用的代理是JDK动态代理

如果一个类没有实现任何接口,默认使用的是cglib动态代理

 在这里倘若强转的是类SomeService类,则会报如下错误:

 

 实现效果:

 

 

以上是关于Spring基础[IOC/DIAOP]的主要内容,如果未能解决你的问题,请参考以下文章

初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段

Spring boot:thymeleaf 没有正确渲染片段

What's the difference between @Component, @Repository & @Service annotations in Spring?(代码片段

[vscode]--HTML代码片段(基础版,reactvuejquery)

spring练习,在Eclipse搭建的Spring开发环境中,使用set注入方式,实现对象的依赖关系,通过ClassPathXmlApplicationContext实体类获取Bean对象(代码片段

Spring Rest 文档。片段生成时 UTF-8 中间字节无效 [重复]