欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring控制反轉(zhuǎn)和依賴注入超詳細(xì)講解

 更新時(shí)間:2025年10月20日 11:39:00   作者:詩(shī)句???南笙  
控制反轉(zhuǎn)(IoC)與依賴注入(DI)是密切相關(guān)的概念,它們通常一起出現(xiàn)在討論Spring框架時(shí),這篇文章主要介紹了Spring控制反轉(zhuǎn)和依賴注入的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下

概念

什么是 IoC

IoC(Inversion of Control),即控制反轉(zhuǎn),是一種設(shè)計(jì)原則,指的是將對(duì)象的創(chuàng)建、依賴關(guān)系的管理,從代碼內(nèi)部轉(zhuǎn)移到外部容器(比如Spring容器)中去控制,從而讓開(kāi)發(fā)者不再手動(dòng)管理這些依賴關(guān)系。

簡(jiǎn)單來(lái)說(shuō):

原本是由程序員主動(dòng)控制去創(chuàng)建對(duì)象和管理依賴,現(xiàn)在這個(gè)控制權(quán)交給了Spring容器,由它來(lái)負(fù)責(zé)創(chuàng)建對(duì)象并注入依賴,這就是控制權(quán)的“反轉(zhuǎn)”。

傳統(tǒng)方式(沒(méi)有IoC):

public class UserService {
    // 手動(dòng)創(chuàng)建依賴對(duì)象
    private UserRepository userRepo = new UserRepositoryImpl(); 
}

使用IoC方式:

ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");

HelloSpring helloSpring = (HelloSpring) context.getBean("helloSpring");

什么是 DI

DI(Dependency Injection),即依賴注入,是 IoC 的一種實(shí)現(xiàn)方式。

依賴注入是指:將對(duì)象所依賴的其他對(duì)象(依賴項(xiàng)),通過(guò)某種方式“注入”到該對(duì)象中,而不是由該對(duì)象自己去創(chuàng)建或查找這些依賴。

換句話說(shuō),DI 是 IoC 的具體技術(shù)手段,是 Spring 用來(lái)實(shí)現(xiàn) IoC 的主要方法。

引入jar包

在pom.xml引入下面jar包

<properties>
    <spring.version>4.0.2.RELEASE</spring.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <!-- spring框架包 -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-test</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-oxm</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-tx</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aop</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-context-support</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-expression</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-orm</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <!-- lombok 可是省去pojo類中的get和set方法 -->
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.24</version>
    </dependency>

    <dependency>
      <groupId>javax.annotation</groupId>
      <artifactId>javax.annotation-api</artifactId>
      <version>1.2</version>
    </dependency>


  </dependencies>

引入maven后通過(guò)resources直接建立spring-config.xml文件

測(cè)試控制反轉(zhuǎn)和依賴注入

在com.hz下建立HelloSpring類

@Data //注解實(shí)現(xiàn)get和set方法
public class HelloSpring {
    private String name;

    public void sayHello(){
        System.out.println("hello spring"+ name);
    }

}

在spring-config.xml下建立相應(yīng)的bean

<!-- 創(chuàng)建一個(gè) com.hz.HelloSpring類的實(shí)例,Bean 的 ID 是 helloSpring。-->
    <bean id="helloSpring" class="com.hz.HelloSpring">
        <!-- 給 com.hz.HelloSpring類下的屬性為:name的賦值,值為value:lisi-->
        <property name="name" value="lisi"></property>
    </bean>

建立測(cè)試

public class HelloSpringTest {

    @Test
    public void sayHello() {
        //使用ClassPathXmlApplicationContext讀取配置文件
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");

        //不是HelloSpring helloSpring = new HelloSpring()了
        HelloSpring helloSpring = (HelloSpring) context.getBean("helloSpring");

        helloSpring.sayHello();
    }
}

輸出hello spring lisi

測(cè)試控制反轉(zhuǎn)和依賴注入2

在com.hz.dao下建立UserDao接口

public interface UserDao {
    public int addUser();
}

在com.hz.dao.impl下建立UserDaoImpl類

public class UserDaoImpl implements UserDao {
    @Override
    public int addUser() {
        System.out.println("UserDaoImpl的addUser方法");
        return 0;
    }
}

在com.hz.service下建立UserService接口

public interface UserService {
    public int addUser();

}

在com.hz.service.impl下建立UserServiceImpl類

@Data
public class UserServiceImpl implements UserService {
    private UserDao userDao;

    public int addUser() {
        return userDao.addUser();
    }
}

項(xiàng)目結(jié)構(gòu):

在spring-config.xml下建立相應(yīng)的bean

<!--    Spring 會(huì)實(shí)例化一個(gè) UserDaoImpl對(duì)象,并把它管理起來(lái),你可以用 id "userDao"來(lái)引用它。-->
    <bean id="userDao" class="com.hz.dao.impl.UserDaoImpl"></bean>

    <bean id="userService" class="com.hz.service.impl.UserServiceImpl">
<!--        表示要給這個(gè) UserServiceImpl對(duì)象中的名為 userDao的屬性(通常是成員變量)注入一個(gè)值。
            注入的方式是通過(guò) 調(diào)用 setUserDao(...)方法(也就是 JavaBean 規(guī)范的 setter 方法),把一個(gè)引用類型的值傳進(jìn)去
      其中 name="userDao"→ 指的是目標(biāo) Bean 中的屬性名(一般對(duì)應(yīng)成員變量 private UserDao userDao;的字段名,且要求有對(duì)應(yīng)的 setter 方法:setUserDao(...))
      其中 ref="userDao"→ 表示要注入的是另一個(gè) Bean,這個(gè) Bean 的 ID 是 "userDao"(也就是你在上面或別處定義的 com.hz.dao.impl.UserDaoImpl對(duì)象)
                     -->
        <property name="userDao" ref="userDao"></property>
    </bean>

建立測(cè)試

public class UserServiceImplTest {

    @Test
    public void addUser() {
        //使用ClassPathXmlApplicationContext讀取配置文件
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");

        UserService userService = (UserService) context.getBean("userService");


        userService.addUser();
    }
}

使用注解實(shí)現(xiàn)Ioc和依賴注入

之前在spring-config.xml下的bean就可以刪除了,然后修改它的配置文件頭部,修改為:

<?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
">

啟動(dòng)組件掃描,表示哪個(gè)包可以使用注解

<context:component-scan base-package="com.hz.dao,com.hz.service"/>

注解:

Spring IOC常用注解

@Component:實(shí)現(xiàn)Bean組件的定義

@Repository([實(shí)例化名稱]) :用于標(biāo)注DAO類

@Service([實(shí)例化名稱]) :用于標(biāo)注業(yè)務(wù)類

@Autowired+@Qualifier("userDao")等價(jià)于@Resource(name = "userDao")

Component和Repository與Service的作用相同,主要是為了區(qū)分dao包和service包

以示例2開(kāi)啟講解

在原用的基礎(chǔ)上改造com.hz.dao.impl下的UserDaoImpl類

@Repository
public class UserDaoImpl implements UserDao {
    @Override
    public int addUser() {
        System.out.println("UserDaoImpl的addUser方法");
        return 0;
    }
}

@Repository("userDao")相當(dāng)于:<bean id="userDao" class="com.hz.dao.impl.UserDaoImpl"></bean>

@Repository值是系統(tǒng)默認(rèn)賦值,值為當(dāng)前類的類名,首字母小寫(xiě)即userDaoImpl

在原用的基礎(chǔ)上改造com.hz.service.impl下的UserServiceImpl類

@Service
@Data
public class UserServiceImpl implements UserService {
    @Autowired
    private UserDao userDao;

    @Override
    public int addUser() {
        return userDao.addUser();
    }
}

@Service和@Repository效果相同

@Autowired相當(dāng)于

<bean id="userDao" class="com.hz.dao.impl.UserDaoImpl"></bean>

<bean id="userService" class="com.hz.service.impl.UserServiceImpl">
    <property name="userDao" ref="userDao"></property>
</bean>

下的<property name="userDao" ref="userDao"></property>,系統(tǒng)會(huì)自動(dòng)賦值

建立測(cè)試

public class UserServiceImplTest {

    @Test
    public void addUser() {
        //使用ClassPathXmlApplicationContext讀取配置文件
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        UserService userService = (UserService) context.getBean("userServiceImpl");
        userService.addUser();
    }
}

輸出:UserDaoImpl的addUser方法

總結(jié)

到此這篇關(guān)于Spring控制反轉(zhuǎn)和依賴注入的文章就介紹到這了,更多相關(guān)Spring控制反轉(zhuǎn)和依賴注入內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論