Spring依賴注入(DI:配置文件+注解)


依賴注入

Spring依賴注入。。。。。。。。。。。。。。。。,兩種方式我們可以達到把Spring容器創建的對象注入到我們需要用的位置。第一個式配置文件方式(配置文件中配置),另一種式注解的方式注入指定位置(簡單,方便)。 

 1.配置文件注入

配置文件的注入方式也有setter注入,構造函數注入,p命名空間的注入,SpEl表達式注入,集合(List,Set,Map)Properties等的注入等注入方式。如下實現常用的幾個注入方式:

方式一:Set注入

UserDao:

package com.spring.demo02;

public class UserDao {
    public void save() {
        System.out.println("持久層。。。");
    }
}
View Code

UserService:

package com.spring.demo02;

public class UserService {
    //配置文件注入:提供成員屬性,設置set方法
    private UserDao userDao;
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
    
    public void save() {
        System.out.println("業務層。。。");
        //調用
        userDao.save();
    }
}
View Code

配置文件設置依賴注入:

<?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:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans.xsd">
       
       <!-- 演示的依賴注入 -->
       <bean id="userDao" class="com.spring.demo02.UserDao"/>
       
       <bean id="userService" class="com.spring.demo02.UserService">
           <property name="userDao" ref="userDao"/>
       </bean>
       
</beans>
View Code

測試依賴注入:

package com.spring.demo02;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestDI {
    @Test
    public void run() {
        //創建容器對象,加載配置文件,創建userDao對象,userService也被創建
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        //獲取userService對象
        UserService userService = (UserService) context.getBean("userService");
        //調用save方法
        userService.save();
    }
}
View Code

運行結果:

 

 

方式二:構造函數注入

User:

package com.spring.demo03;

public class User {
    private String name;
    private Integer age;
    
    public User(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "User [name=" + name + ", age=" + age + "]";
    }
    
}
View Code

配置文件設置依賴注入:

<?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:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans.xsd">
       
       <!-- 方式一:Set注入 -->
       <bean id="userDao" class="com.spring.demo02.UserDao"/>
       
       <bean id="userService" class="com.spring.demo02.UserService">
           <property name="userDao" ref="userDao"/>
       </bean>
       
       
       <!-- 方式二:構造方法的注入方式:name是屬性名稱,value是注入的值,如果要出入引用使用raf標簽 -->
       <bean id="user" class="com.spring.demo03.User">
           <constructor-arg name="name" value="Tom"/>
           <constructor-arg name="age" value="18"/>
           
           <!-- 第二種方式  index寫序號就行 -->
           <!-- <constructor-arg index="0" value="Tom"/>
           <constructor-arg name="1" value="18"/> -->
           
           
       </bean>
View Code

測試:

package com.spring.demo03;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestDI {
    @Test
    public void run() {
        //創建容器對象,加載配置文件,創建User類的對象,並構造函數初始化
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        //獲取user對象
        User user = (User) context.getBean("user");
        System.out.println(user);
    }
}
View Code

運行結果:

 

 

方式三:p命名空間注入方式

User:

package com.spring.demo03;

public class User {
    private String name;
    private Integer age;
    
    public void setName(String name) {
        this.name = name;
    }

    public void setAge(Integer age) {
        this.age = age;
    }



    @Override
    public String toString() {
        return "User [name=" + name + ", age=" + age + "]";
    }
    
}
View Code

配置文件設置依賴注入:

<?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:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans.xsd">
    
    <!-- 方式三:p命名空間注入方式 -->
    <bean id="user" class="com.spring.demo03.User" p:name="Tom" p:age="18" />        
       
</beans>
View Code

 

 配置文件中需要設置命名空間p

測試:

package com.spring.demo03;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestDI {
    @Test
    public void run() {
        //創建容器對象,加載配置文件,創建User類的對象,並構造函數初始化
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        //獲取user對象
        User user = (User) context.getBean("user");
        System.out.println(user);
    }
}
View Code

運行結果;

 

 

方式四:集合方式

 

 

 

 2.注解注入

Spring中提供一些作用在類上的注解,我們使用這些注解可以標志對應的類對象。還有通過一些屬性的注解把容器創建的對象注入到指定位置,還有注入一些基本類型的值。還有一些作用范圍的注解來控制對象的單例或者多例,生命周期等。

類上使用注解:

@Component   //每個層都可以,作用在類上
@Controller    //作用在web層
@Service       //作用在業務層
@Repository    //作用在持久層

這三個注解都放在每層的類上面,會創建對應的對象,Component可以每層類上但建議使用其他三個注解增強

屬性注解:

@Value            //用於注入基本類型
@Autowired        //用於對象注入,默認按類型進行自動裝配
@Qualifier        //用於對象注入,按名稱注入
@Resource         //相當於@Autowired與Qualifier一起使用,JDK提供的注解,Spring支持

作用范圍

@Scope(value="prototype")    //Bean的作用范圍注解,作用在類上,singleton:單例(默認) prototype:多例
@PostConstruct               //相當於init-method
@PreDestroy                  //相當於destroy-method

  

實現注解方式

UserService:

package com.spring.demo04;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

/**
 * 組件注解,標記該類
 * 相當於:<bean id="userService" class="com.spring.demo04.UserService">
 */
@Component(value="userService")
public class UserService {
    //屬性注解:基本數據類型
    @Value(value="業務層")
    private String name;
    
    //@Resource(name="userDao")    JDK提供的注解,spring支持
    //對象注解:按類型自動裝配
    @Autowired
    @Qualifier(value="userDao")    //也可以不寫,一旦寫名稱必須一致
    private UserDao userDao;
    
    
    public void save() {
        System.out.println(name+"啟動。。。");
        userDao.save();
    }
}

UserDao:

package com.spring.demo04;
import org.springframework.stereotype.Repository;

/**
 * UserDao交給IOC容器
 * 相當於:<bean id="userDao" class="com.spring.demo04.UserDao">
 */
@Repository(value="userDao")
public class UserDao {
    
    public void save() {
        System.out.println("持久層啟動。。。。");
    }
}

配置文件:

<?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.spring.demo04" />
    
</beans>

測試:

package com.spring.demo04;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestDI {
    @Test
    public void run() {
        //創建容器對象,加載配置文件
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        //獲取userService對象
        UserService userService = (UserService) context.getBean("userService");
        //調用save方法
        userService.save();
    }
}

 

運行結果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM