科幻照進現實:我國工廠運維人員已應用 AR 眼鏡技術
阿新 • • 發佈:2021-09-10
Spring常用註解
專案中註解和XML的選擇問題
- 學習基於註解的IOC配置,即註解配置和xml配置要實現的功能都是一樣的,都是要降低程式間的耦合,只是配置的形式不一樣
- 關於實際開發中到底使用xml還是註解,每家公司有著不同的使用習慣
- 註解優勢:配置簡單,維護方便
- xml優勢:修改時,不用改原始碼,不涉及重新編譯和部署
用於建立物件的註解
註解 | 說明 |
---|---|
@Component | 使用在類上用於例項化Bean(普通的java物件) |
@Controller | 使用在web層類上用於例項化Bean (控制器型別java物件 和瀏覽器互動) |
@Service | 使用在service層類上用於例項化Bean (新增服務型別的程式碼上面) |
@Repository | 使用在dao層類上用於例項化Bean (新增到我們資料庫互動程式碼上面) |
注意:
使用註解進行開發時,需要在applicationContext.xml中配置元件掃描,作用是指定哪個包及其子包下的Bean需要進行掃描以便識別使用註解配置的類、欄位和方法。
<!--註解的元件掃描-->
<context:component-scan base-package="com.ujiuye"></context:component-scan>
使用@Component或@Repository標識UserDaoImpl需要Spring進行例項化。
//@Component("userDao")
@Repository("userDao")
public class UserDaoImpl implements UserDao {
@Override
public void save() {
System.out.println("save running... ...");
}
}
使用@Component或@Service標識UserServiceImpl需要Spring進行例項化
//@Component("userService") @Service("userService") public class UserServiceImpl implements UserService { @Override public void save() { System.out.println("save running... ..."); } }
用於注入資料的註解
註解 | 說明 |
---|---|
@Value | 注入普通屬性 |
@Autowired | 自動按照型別注入。當使用註解注入屬性時,set 方法可以省略。它只能注入其他 bean 型別。當有多個型別匹配時,使用要注入的物件變數名稱作為 bean 的 id,在 spring 容器查詢,找到了也可以注入成功。找不到就報錯 |
@Qualifier | 結合@Autowired一起使用用於根據名稱進行依賴注入 |
@Resource | 相當於@Autowired+@Qualifier,按照名稱進行注入 |
使用@Value進行字串的注入
@Repository("userDao")
public class UserDaoImpl implements UserDao {
@Value("admin")
private String str;
private String driver;
@Override
public void save() {
System.out.println(str);
System.out.println(driver);
System.out.println("save running... ...");
}
}
使用@Autowired或者@Autowired+@Qulifier或者@Resource進行userDao的注入
//@Component("userService")
@Service("userService")
public class UserServiceImpl implements UserService {
/*@Autowired
@Qualifier("userDao")*/
@Resource(name="userDao")
private UserDao userDao;
@Override
public void save() {
userDao.save();
}
}
用於改變作用範圍的註解
註解 | 說明 |
---|---|
@Scope | 標註Bean的作用範圍,scope取值singleton prototype request session globalsession |
使用@Scope標註Bean的範圍
//@Scope("prototype")
@Scope("singleton")
public class UserDaoImpl implements UserDao {
//此處省略程式碼
}
Spring基於註解的IOC案例
子主題 1
Spring的純註解配置
註解IOC案例待改造問題
- 還需使用註解替代
非自定義的Bean的配置:
載入properties檔案的配置:context:property-placeholder
元件掃描的配置:context:component-scan
引入其他檔案:
新註解說明
註解 | 說明 |
---|---|
@Configuration | 用於指定當前類是一個 Spring 配置類,當建立容器時會從該類上載入註解 |
@ComponentScan | 用於指定 Spring在初始化容器時要掃描的包。 作用和在 Spring 的 xml 配置檔案中的 <context:component-scan base-package="com.offcn"/>一樣 |
@Bean | 使用在方法上,標註將該方法的返回值儲存到 Spring容器中 |
@PropertySource | 用於載入xxx.properties 檔案中的配置 |
@Import | 用於匯入其他配置類 |
@Configuration //指定當前類是一個配置類,取代applicationContext.xml配置檔案
@ComponentScan("com.offcn") //指定Spring在初始化容器時要掃描的包
@Import({xxx.class}) //匯入其他的配置類
public class SpringConfiguration {
...
}
@PropertySource("classpath:dbConfig.properties") //當前類中引入dbConfig.properties檔案
public class DataSourceConfiguration {
@Value("${jdbc.driver}")
private String driver;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
}
@Bean(name="dataSource") //將方法的返回值存入到IOC容器當中
public DataSource getDataSource() throws Exception {
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setDriverClass(driver);
dataSource.setJdbcUrl(url);
dataSource.setUser(username);
dataSource.setPassword(password);
return dataSource;
}
通過註解獲取容器
public void AnnotationTest (){
//使用AnnotationConfigApplicationContext獲得ioc容器物件
ApplicationContext context= new AnnotationConfigApplicationContext(SpringConfig.class);
Object obj = context.getBean("...");
}
Spring整合Junit
IOC測試類中的問題和解決思路
在測試類中,每個測試方法都有以下兩行程式碼:
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = (UserService) context.getBean("userService");
這兩行程式碼的作用是獲取容器,如果不寫的話,直接會提示空指標異常。所以又不能輕易刪掉。
整合Junit 配置步驟
- 新增技術依賴
<properties>
<spring.version>5.2.5.RELEASE</spring.version>
</properties>
<!--此處需要注意的是,spring5 及以上版本要求 junit 的版本必須是 4.12 及以上-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!--匯入Spring整合Junit的依賴-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<!--匯入spring的context依賴-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
- 使用@RunWith 註解替換原有執行器
@RunWith(SpringJUnit4ClassRunner.class)
public class SpringJunitTest {
}
- 使用@ContextConfiguration 指定 Spring 配置檔案的位置
@RunWith(SpringJUnit4ClassRunner.class)
//載入spring核心配置檔案
//@ContextConfiguration(value = {"classpath:applicationContext.xml"})
//載入spring核心配置類
@ContextConfiguration(classes = {SpringConfiguration.class})
public class SpringJunitTest {
}
- 使用@Autowired 給測試類中的變數注入資料
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {SpringConfiguration.class})
public class SpringJunitTest {
@Autowired
private ApplicationContext context;
@Test
public void test(){
...
}
}