Spring框架簡介⑥

Milky-way發表於2018-08-07

八 註解方式注入

首先 引入註解依賴包

連結:https://pan.baidu.com/s/1lyoSeLmkkFJurBF_4GFH4g 密碼:hyz8

引入約束檔案: 按照我給的頭資訊即可配置檔案資訊

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

    <!-- 要想使用註解, 必須開啟註解驅動
     -->
     <context:annotation-config/>
     
     <!-- 先配置兩個bean
      -->
      <bean id="userDao" class="com.rl.spring.dao.impl.UserDaoImpl"></bean>
      <bean id="userService" class="com.rl.spring.service.impl.UserServiceImpl"></bean>
</beans>

@Resource註解

1 加在屬性上

使用註解方式不需要使用set方法

UserServiceImpl類

package com.rl.spring.service.impl;

import javax.annotation.Resource;

import com.rl.spring.dao.UserDao;
import com.rl.spring.service.UserService;

public class UserServiceImpl implements UserService {

    @Resource
	private UserDao userDao;
	
    @Override
	public void save() {
		userDao.save();
	}

}

測試程式碼:

package com.rl.spring.test;

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

import com.rl.spring.service.UserService;

public class TestSpring {

	@Test
	public void test() {
		ApplicationContext ctx =
				new ClassPathXmlApplicationContext("ApplicationContext.xml");
		UserService userService = (UserService) ctx.getBean("userService");
		userService.save();
	}
}

輸出:

user被儲存了

 

2 加在set方法上

當了id的userDao跟左邊的三個userDao都沒有一個匹配上時, 出按照型別來匹配

@Resource註解還支援name屬性指定具體的id的名字, 一旦使用name屬性, 上圖方式就失效了, 直接根據name屬性指定的值來匹配, 無法匹配時則報錯

 

@Autowired註解

@Autowired有一個required屬性, 預設是true為必填

1 加在屬性上:

跟@Resource註解一樣的用法

區別:

@Autowired註解是直接按照型別進行匹配的, 一旦出現兩個同型別的, 則報錯, 解決方法是必須根據name來指定, 但是@Autowired註解並沒有name屬性, 只能結合@Qulifier註解的value屬性進行指定具體的id的名稱來實現注入

package com.rl.spring.service.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;

import com.rl.spring.dao.UserDao;
import com.rl.spring.service.UserService;

public class UserServiceImpl implements UserService {

    @Autowired
    @Qualifier(value="")
	private UserDao userDao;
	
    @Override
	public void save() {
		userDao.save();
	}

}

 

2 加在set方法上:

同@Resource註解的使用, 同時存在@Qulifier註解, 根據需要指定value屬性的值

 

九 Spring掃描器來管理bean

如果專案很大, 則可以使用註解掃描器來掃描帶有相應註解的類(層)

@Controller @Repository @Component @Service

@Controller: 控制層的類

@Service: 服務層的類

@Repository: dao層的類

@Component: 普通層(無法分層的類)

配置檔案:

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

    <!-- 配置註解掃描器, 掃描com.rl.spring包下和子包下的所有類
     -->
    <context:component-scan base-package="com.rl.spring"/>

    <!-- 如果使用了註解掃描器, 則註解驅動可以不用配置
     -->
     <!-- <context:annotation-config/> -->
     
</beans>

以上註解標識的類的id預設是類名的首字元小寫, 單也可以使用@Service註解中的value屬性來指定id名, 此時預設類名首字元小寫規則失效

UserServiceImpl類

package com.rl.spring.service.impl;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

import com.rl.spring.dao.UserDao;
import com.rl.spring.service.UserService;
@Service(value="aa")
public class UserServiceImpl implements UserService {

	@Autowired
	@Qualifier(value="userDaoImpl")
	private UserDao userDao;
	

	@Override
	public void save() {
		userDao.save();
	}

}

其中的@Qualifier註解在dao實現類只有一個的情況下可以不使用

測試程式碼:

package com.rl.spring.test;

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

import com.rl.spring.service.UserService;

public class TestSpring {
	
	@Test
	public void test2() {
		ApplicationContext ctx =
				new ClassPathXmlApplicationContext("ApplicationContext.xml");
		UserService userService = (UserService) ctx.getBean("aa");
		userService.save();
	}
}

當Service層的value="aa"時, 測試程式碼中的getBean則必須是aa, 如果沒有則按照取Service層的類名首字元小寫規則

 

九 spring和junit的整合

測試程式碼的配置:

package com.rl.spring.test;

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;

import com.rl.spring.service.UserService;

/**
 * @RunWith:指定spring對junit提供的一個執行器
 * @ContextConfiguration:指定spring配置檔案位置
 */
@RunWith(value=SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:ApplicationContext.xml"})
public class TestSpring1 {

	/**
	 * 在junit的bean中注入UserService
	 */
	@Autowired
	UserService userService;
	
	@Test
	public void test2() {
		userService.save();
	}
}

其他配置和輸出不變

 

相關文章