程式狂想筆記

一個攻城師奮鬥史

0%

Spring 自動注入小記

自動注入筆記

autowired 加載方式

建構子

成員變數

setter method

任意 method

XML 自動掛載

1
<content:component-scan base-package="com.xxxx.oooo">

自動載入相關 annotation

自動載入

組間掃描
@Component
@ComponentScan

自動注入
@Autowired

定義配置類

@Configuration(classes=AppConfig.class)

JUnit

安裝

  1. 設定 JUnit Library 加載
    pom.xml 設定 spring-test,junit 如下設定參考
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.qfedu</groupId>
    <artifactId>spring01demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <dependencies>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>4.3.13.RELEASE</version>
    </dependency>
    <dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
    </dependency>
    <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    </dependency>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>4.3.13.RELEASE</version>
    </dependency>
    </dependencies>
    </project>
  1. 設定 test 程式加入 設定
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(classes = AppConfig.class)

**這邊注意

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package hello;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = AppConfig.class)
public class testHello {

@Autowired
private MessagePrinter messagePrinter;

@Test
public void testPrint() {
messagePrinter.printMessage();
}
}
  1. 自動載入
    @Autowired

下面程式參考:JUnit高级用法之@RunWith - 摆渡者 - OSCHINA

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:applicationContext.xml" })
public class UserManagerTest {
  @Autowired
  ApplicationContext ctx;

  @Test
  public void testAddUser() {
    try {
      UserManager userManager = ctx.getBean(UserManager.class);
      userManager.addUser();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

自動配裝衝突

  1. @Primary
    在 Component 定義 @primary

  2. @Qualifier
    默認 宣告配裝 使用 @Qualifier

  3. @Qualifier
    自動配裝可使用 bean id(第一個小寫)
    @Qualifier(“helloWorld”)

相關載入事情

  1. @Resource( name = “helloWorld” )

@Resource( name = "helloWorld" ) 等於

1
2
@Autowired
@Qualifier( name = "helloWorld" )

  1. @Controller , @Service, @Repository
    @Controller , @Service, @Repository 等於 @Component 相同功能
    比較有語意,跟 @Component 沒什麼差別。

Autowired (require = false )

if(xxx == null)

指定掃描

  1. @ComponentScan( “com.xxx.demo” )
    掃描底下 “com.xxx.demo”的所有 Package

  2. @ComponentScan( basePackages = {“com.xxx.demo.web”, “com.xxx.demo.service”, “com.xxx.demo.dao”})
    解決上面不能放多個

  3. @ComponentScan( basePackageClasses = {MessagePrinter.class, MessageService.class})
    上面嚴重缺點,不能自動用程式”重構”功能,連帶修改

小記

這邊的 @Autowired 預設都是單例模式
額且啟動服務(這邊講的是 Web )的時候,這些套件就會自動載入

這邊也順便紀錄一下,Servlet 生命週期,init() 是 request 觸發的時候會觸發
Servlet 其實也算是只會實例一個,不是多個 Servlet 程式
所以在多執行緒需要注意一下問題…