目錄
1.存儲Bean對象的注解
1.1 五大類注解
1.2 方法注解
1.3添加注解的依賴
2.注解的使用
2.1??controller注解
2. 2Service注解
?2.3.Resopsitory注解
2.4Component注解
2.5Configuration注解
2.6 注解之間的關(guān)系
3.方法注解
3.1 方法注解要配合類注解來使用。
3.2 重命名Bean
4.獲取Bean對象(對象裝配)
4.1屬性注?(常用)
4.2構(gòu)造?法注?(推薦使用)
4.3Setter 注?
4.4三種注?優(yōu)缺點分析
4.5?@Resource:另?種注?關(guān)鍵字
4.6?@Autowired 和 @Resource 區(qū)別
4.7?解決同?類型多個 Bean 的報錯:
1.存儲Bean對象的注解
兩種:五大類注解和方法注解
1.1 五大類注解
@Controller :(控制器:驗證用戶(廣義用戶包括前端)請求的數(shù)據(jù)正確性)(類似于安保系統(tǒng))
@Service :(服務(wù):服務(wù)層,用來編排和調(diào)度具體執(zhí)行方法的,(客服中心))
@Repository: (持久層:和數(shù)據(jù)庫的交互;執(zhí)行者) ==DAO層(Date Accsess Object)數(shù)據(jù)訪問層
@Component :(組件:(工具類))
@Configuration :(配置項:項目當(dāng)中的一些配置,存儲項目當(dāng)中的一些注解)
1.2 方法注解
@Bean
1.3添加注解的依賴
Spring設(shè)計理念:約定大于配置,小駝峰的形式
?在resources文件夾下創(chuàng)建spring.xml,設(shè)置掃描包的路徑
<?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:content="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">
<!-- 掃描包的地址-->
<content:component-scan base-package="com.java.demo"></content:component-scan>
</beans>
2.注解的使用
1.添加spring依賴(pom.xml)
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.13</version>
</dependency>
</dependencies>
2.添加啟動類
?
2.1??controller注解
package com.java.demo.controller;
import org.springframework.stereotype.Controller;
@Controller //將當(dāng)前類存儲到spring中
public class StudentController {
public void sayHi(){
System.out.println("do studentController sayHi()");
}
}
import com.java.demo.controller.StudentController;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class App {
public static void main(String[] args) {
//1.得到Spring對象
ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
//2.得到bean對象
StudentController studentController =
context.getBean("studentController",StudentController.class);
//3.使用bean
studentController.sayHi();
}
}
注意:?
默認(rèn)情況:原類名首字母小寫就能讀取到Bean對象;
特例:原類名如果首字母和第二字母都是大寫的情況下,那么bean名稱就是原類名;
2. 2Service注解
package com.java.demo.service;
import org.springframework.stereotype.Service;
@Service
public class StudentService {
public void sayHi(){
System.out.println("StudentService sayHi()");
}
}
ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
StudentService studentService =
context.getBean("studentService",StudentService.class);
studentService.sayHi();
?2.3.Resopsitory注解
import org.springframework.stereotype.Repository;
@Repository
public class StudentRepository {
public void sayhi(){
System.out.println("StudentRepository sayhi");
}
}
ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
StudentRepository studentRepository =
context.getBean("studentRepository",StudentRepository.class);
studentRepository.sayhi();
2.4Component注解
import org.springframework.stereotype.Component;
@Component
public class StudentComponent {
public void sayhi(){
System.out.println("StudentComponent sayhi");
}
}
ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
StudentComponent studentComponent =
context.getBean("studentComponent",StudentComponent.class);
studentComponent.sayhi();
2.5Configuration注解
import org.springframework.context.annotation.Configuration;
@Configuration
public class StudentConfiguration {
public void sayhi(){
System.out.println("StudentConfiguration sayhi");
}
}
ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
StudentConfiguration studentConfiguration =
context.getBean("studentConfiguration",StudentConfiguration.class);
studentConfiguration.sayhi();
2.6 注解之間的關(guān)系
?@Controller / @Service / @Repository / @Configuration 等注解的源碼,他們屬于@Component 的“?類”。
3.方法注解
類注解是添加到某個類上的,??法注解是放到某個?法上的。
3.1 方法注解要配合類注解來使用。
在 Spring 框架的設(shè)計中,?法注解 @Bean 要配合類注解才能將對象正常的存儲到 Spring 容器中,如下代碼所示:
?
@Component
public class Users {
@Bean
public User user1() {
User user = new User();
user.setId(1);
user.setName("Java");
return user;
}
}
3.2 重命名Bean
可以通過設(shè)置 name 屬性給 Bean 對象進(jìn)?重命名操作,如下代碼所示:
@Component
public class Users {
@Bean(name = {"u1"})
public User user1() {
User user = new User();
user.setId(1);
user.setName("Java");
return user;
}
}
?name 其實是?個數(shù)組,?個 bean 可以有多個名字:
@Bean(name = {"u1", "us1"})
public User user1() {
User user = new User();
user.setId(1);
user.setName("Java");
return user;
}
問題:當(dāng)@Bean使用了重命名之后,那么默認(rèn)的方法名是否還能獲取對象?
答案:不能,當(dāng)給@Bean對象重命名之后,默認(rèn)的使用方法名獲取對象的方式就不能使用了。
4.獲取Bean對象(對象裝配)
獲取對象裝配的方法:
1. 屬性注?
2. 構(gòu)造?法注?
3. Setter 注?
4.1屬性注?(常用)
屬性注?是使? @Autowired 實現(xiàn)的,將 Service 類注?到 Controller 類中。
優(yōu)點:簡單
缺點:
1.沒辦法實現(xiàn)final修飾的變量注入
2.兼容性不好:只適用于IoC容器
3.風(fēng)險點:因為寫法簡單,所以違背單一設(shè)計原則的概論更大。
4.2構(gòu)造?法注?(推薦使用)
構(gòu)造方法注入(Spring官方推薦的注入方式),可以不加@Autowired。
特點:如果當(dāng)前類中只有一個構(gòu)造方法的話,那么@Autowired注解可以省略;
優(yōu)點:
1.可以注入一個不可變的對象(使用了final修飾的對象);
2.注入的對象不會被修改(構(gòu)造方法只能執(zhí)行一次);
3.構(gòu)造方法注入可以保證注入對象完全被初始化;
4.構(gòu)造方法的兼容性(通用性)更好;
4.3Setter 注?
Setter 注?和屬性的 Setter ?法實現(xiàn)類似,只不過在設(shè)置 set ?法的時候需要加上 @Autowired 注
解
優(yōu)點:Setter注入非常符合單一設(shè)計原則(每個方法只傳遞一個對象)。
缺點:
1.沒辦法實現(xiàn)final修飾的變量注入
2.使用setter注入的對象,對象可能會被修改
示例代碼:
package com.java.demo.controller;
import com.java.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import javax.annotation.Resource;
@Controller
public class UserController {
//1.屬性注入
@Autowired //注入對象
@Resource
private UserService userService;
//2.Setter注入
private UserService userService;
@Autowired
@Resource
public void setUserService(UserService userService) {
this.userService = userService;
}
//3.構(gòu)造方法注入
private final UserService userService;
@Autowired
//@Resource //不能用在構(gòu)造方法上
public UserController(UserService userService) {
this.userService = userService;
}
public void sayHi(){
System.out.println("com.java.demo -> do UserController sayHi()");
userService.sayHi();
userService.age = 20;
userService.sayHi();
}
}
4.4三種注?優(yōu)缺點分析
1.屬性注?的優(yōu)點是簡潔,使??便;缺點是只能?于 IoC 容器,如果是? IoC 容器不可?,并且只有在使?的時候才會出現(xiàn) NPE(空指針異常)。
2.構(gòu)造?法注?是 Spring 推薦的注??式,它的缺點是如果有多個注?會顯得?較臃腫,但出現(xiàn)這種情況你應(yīng)該考慮?下當(dāng)前類是否符合程序的單?職責(zé)的設(shè)計模式了,它的優(yōu)點是通?性,在使?之前?定能把保證注?的類不為空。
3.Setter ?式是 Spring 前期版本推薦的注??式,但通?性不如構(gòu)造?法,所有 Spring 現(xiàn)版本已
經(jīng)推薦使?構(gòu)造?法注?的?式來進(jìn)?類注?了。
4.5?@Resource:另?種注?關(guān)鍵字
@Autowired 和 @Resource 的區(qū)別
1.出身不同:@Autowired 來?于 Spring,? @Resource 來?于 JDK 的注解;
2.使?時設(shè)置的參數(shù)不同:相?于 @Autowired 來說,@Resource ?持更多的參數(shù)設(shè)置,例如
name 設(shè)置,根據(jù)名稱獲取 Bean。
3.@Autowired 可?于 Setter 注?、構(gòu)造函數(shù)注?和屬性注?,? @Resource 只能?于 Setter 注
?和屬性注?,不能?于構(gòu)造函數(shù)注?。
解決同?類型多個 Bean 的報錯:
a. 使? @Resource(name="")
b. 使? @Qualifier("")
4.6?@Autowired 和 @Resource 區(qū)別
1.出身不同:@Autowired 來?于 Spring,? @Resource 來?于 JDK 的注解;
2.使?時設(shè)置的參數(shù)不同:相?于 @Autowired 來說,@Resource ?持更多的參數(shù)設(shè)置,例如
name 設(shè)置,根據(jù)名稱獲取 Bean。
3.@Autowired 可?于 Setter 注?、構(gòu)造函數(shù)注?和屬性注?,? @Resource 只能?于 Setter 注?和屬性注?,不能?于構(gòu)造函數(shù)注?
4.拓展區(qū)別:
在Spring(容器)中找Bean有兩種方式:
1.根據(jù)類型查找
2.根據(jù)名稱查找
@Autowired先根據(jù)類型查找(byType),之后再根據(jù)名稱查找(byname)
?@Resource先根據(jù)名稱查找(byname),之后再根據(jù)類型查找(byType)
4.7?解決同?類型多個 Bean 的報錯:
a. 使? @Resource(name="")重命名文章來源:http://www.zghlxwxcb.cn/news/detail-429033.html
b. 使? @Autowired和@Qualifier("")進(jìn)行重命名文章來源地址http://www.zghlxwxcb.cn/news/detail-429033.html
package com.java.demo.controller;
import com.java.demo.entity.User;
import com.java.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import javax.annotation.Resource;
@Controller
public class UserController2 {
//@Resource(name = "user1")
//1.屬性注入方式
@Autowired
@Qualifier(value = "user1")
private User user;
public void sayHi(){
System.out.println("com.java.demo -> do UserController sayHi()");
System.out.println(user.getUsername());
}
}
到了這里,關(guān)于使用Spring的五大類注解讀取和存儲Bean的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!