手撕Spring5框架(四)IOC操做Bean管理(基於註解)

什麼是註解?java

(1)代碼裏特殊的標記,格式:@註解名稱(屬性名稱=屬性值..)spring

(2)能夠在類、方法、屬性上添加註解。express

使用註解的目的?測試

能夠簡化xml配置,使程序變得更簡潔、優雅.net

註解的運用code

建立對象提供的註解包含如下4個:component

特色:上面四個註解的功能都是同樣的,均可以用來建立bean實例,建議使用在對應的功能層次中xml

註解 含義
@Component 最普通的組件,能夠被注入到spring容器進行管理
@Repository 做用於持久層
@Service 做用於業務邏輯層
@Controller 做用於表現層,Controller類

屬性注入提供的註解:對象

  • @Autowired
  • @Qualifier
  • @Resource
  • @Value

特色:@Autowired、@Qualifier、@Resource能夠用於注入對象類型屬性,@Value能夠用戶注入普通類型的屬性。開發

註解 含義
@Autowired 根據屬性類型進行自動裝配
@Qualifier 根據屬性名稱進行注入
@Resource 能夠根據屬性、名稱進行注入
@Value 注入普通類型的屬性

基於註解實現建立對象

1)引入依賴

<!-- spring-aop-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>5.2.8.RELEASE</version>
        </dependency>

2)開啓組件掃描

<?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 https://www.springframework.org/schema/context/spring-context.xsd">

    <!--開啓組件掃描
	base-package屬性:設置要掃描的包
	-->
    <context:component-scan base-package="org.leanr.spring5"></context:component-scan>
</beans>

3)類上添加註解

package org.leanr.spring5.service;

import org.springframework.stereotype.Service;

/**
 * 類上增長建立對象的註解
 * - @Componet
 * - @Service
 * - @Controller
 * - @Repository
 * value屬性能夠不設置,默認是類的名稱,首字母小寫,
 */
@Service(value = "userService")
public class UserService {
    public void add(){
        System.out.println("addddddd");
    }
}

4)編寫測試類

package org.leanr.spring5;

import org.junit.Test;
import org.leanr.spring5.bean.User;
import org.leanr.spring5.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestSpring5 {
    /**
     * IOC操做Bean管理-註解方式建立對象
     */
    @Test
    public void test() {
        ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
        UserService userService = context.getBean("userService", UserService.class);
        System.out.println(userService);
        userService.add();
    }


}

測試類執行結果:

org.leanr.spring5.service.UserService@7920ba90
addddddd

組件掃描配置的細節

<!--use-default-filters屬性表示:是否開啓默認的filter來掃描包下的內容
     默認是true,若是設置爲false,則須要設置指定的規則
     例以下面設置的意思是,註解是@Controller在org.leanr.spring5包下掃描是生效的,其餘註解類不會被掃描到
     -->
    <context:component-scan base-package="org.leanr.spring5" use-default-filters="false">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>
</beans>

基於註解實現屬性的注入

第一步註解方式建立對象

第二步在類中注入外部屬性,並添加屬性的註解

1)@Autowired

@Service(value = "userService")
public class UserService {
    //注入屬性的註解@Autowired,根據屬性類型自動裝入
    @Autowired
    private UserDao userDao;
    public void add(){
        System.out.println("userService add");

        userDao.add();
    }

2)@Qualifier

根據屬性名稱進行注入

/**
 * UserDao的實現類
 */
@Repository(value = "userDaoImpl2")
public class UserDaoImpl implements UserDao {
    public int add() {

        System.out.println("UserDaoImpl add ");
        return 1;
    }
}
@Service(value = "userService")
public class UserService {
    //注入屬性的註解@Autowired,根據屬性類型自動裝入
    @Autowired
    @Qualifier(value = "userDaoImpl2")
    private UserDao userDao;
    public void add(){
        System.out.println("userService add");

        userDao.add();
    }

3)@Resource

既能夠根據類型也能夠名稱注入

@Service(value = "userService")
public class UserService {
    //注入屬性的註解@Autowired,根據屬性類型自動裝入
    //@Autowired
    //@Qualifier(value = "userDaoImpl2")
    //@Resource  //根據類型注入
    @Resource(value="userDaoimpl2")  //根據名稱註解
    private UserDao userDao;
    public void add(){
        System.out.println("userService add");

        userDao.add();
    }

4)@Value

針對普通類型的屬性注入

@Value(value = "zhangsan")
    private String userName;

純註解開發

1)建立配置類,替代xml配置文件

package org.leanr.spring5.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
//Configuration,讓Spring知道這是個配置類
@Configuration
@ComponentScan(basePackages = {"org.leanr.spring5"})
public class SpringConfig {
}

2)編寫測試類

/**
     * 徹底註解開發
     */
    @Test
    public void test3(){
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
        UserService userService = context.getBean("userService", UserService.class);
        userService.add();
    }
相關文章
相關標籤/搜索