亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Spring控制反轉和依賴注入超詳細講解

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

概念

什么是 IoC

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

簡單來說:

原本是由程序員主動控制去創(chuàng)建對象和管理依賴,現(xiàn)在這個控制權交給了Spring容器,由它來負責創(chuàng)建對象并注入依賴,這就是控制權的“反轉”。

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

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

使用IoC方式:

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

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

什么是 DI

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

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

換句話說,DI 是 IoC 的具體技術手段,是 Spring 用來實現(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后通過resources直接建立spring-config.xml文件

測試控制反轉和依賴注入

在com.hz下建立HelloSpring類

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

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

}

在spring-config.xml下建立相應的bean

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

建立測試

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

測試控制反轉和依賴注入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();
    }
}

項目結構:

在spring-config.xml下建立相應的bean

<!--    Spring 會實例化一個 UserDaoImpl對象,并把它管理起來,你可以用 id "userDao"來引用它。-->
    <bean id="userDao" class="com.hz.dao.impl.UserDaoImpl"></bean>

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

建立測試

public class UserServiceImplTest {

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

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


        userService.addUser();
    }
}

使用注解實現(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
">

啟動組件掃描,表示哪個包可以使用注解

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

注解:

Spring IOC常用注解

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

@Repository([實例化名稱]) :用于標注DAO類

@Service([實例化名稱]) :用于標注業(yè)務類

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

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

以示例2開啟講解

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

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

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

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

在原用的基礎上改造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相當于

<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)會自動賦值

建立測試

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方法

總結

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

相關文章

最新評論