欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring使用注解更簡(jiǎn)單的讀取和存儲(chǔ)對(duì)象的方法

 更新時(shí)間:2023年07月18日 10:14:06   作者:whisper-h  
這篇文章主要介紹了Spring使用注解更簡(jiǎn)單的讀取和存儲(chǔ)對(duì)象的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧

在上一篇文章中實(shí)現(xiàn)了基本的Spring讀取和存儲(chǔ)對(duì)象。但在操作的過(guò)程中我們發(fā)現(xiàn)讀取和存儲(chǔ)對(duì)象并沒(méi)有想象中的那么“簡(jiǎn)單”。

所以接下來(lái)我們要講解更加簡(jiǎn)單的操作 Bean 對(duì)象的?法。其核心就是,使用注解

1.Spring的存儲(chǔ)對(duì)象------存儲(chǔ)Bean對(duì)象

之前我們存儲(chǔ) Bean 時(shí),需要在 spring-config 中添加?? bean 注冊(cè)內(nèi)容才?,如下圖所示:

?現(xiàn)在我們只需要?個(gè)注解就可以替代之前要寫??配置的尷尬了。

類注解規(guī)則:1.類名前兩位均為大寫時(shí),返回自身name

                  2.否則,首字母小寫

1.前置工作,配置掃描路徑

想要將對(duì)象成功的存儲(chǔ)到 Spring 中,我們需要配置?下存儲(chǔ)對(duì)象的掃描包路徑,只有被配置的包下的所有類,添加了注解才能被正確的識(shí)別并保存到 Spring 中。

在spring-config.xml中添加如下配置:

<?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="org.example"></content:component-scan>
</beans>

其中標(biāo)紅的一行為注冊(cè)掃描的包,如下圖所示:

注意:即使添加了注解,如果不是在配置的掃描包下的類對(duì)象,也是不能被存儲(chǔ)到Spring中的。

2.添加注解存儲(chǔ)Bean對(duì)象

想要將對(duì)象存儲(chǔ)在 Spring 中,有兩種注解類型可以實(shí)現(xiàn):

1. 類注解:@Controller、@Service、@Repository、@Component、@Configuration。

2. ?法注解:@Bean。

1.@Controller(控制器存儲(chǔ))

使用@Controller存儲(chǔ)Bean的代碼如下所示:

@Controller
public class UserController {
    public void sayHi(){
        System.out.println("hi,userController~");
    }
}

在App中讀取上面的UserController對(duì)象:

public class App {
    public static void main(String[] args) {
        ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml");
        UserController userController=(UserController) context.getBean("userController");
        userController.sayHi();
    }
}

運(yùn)行結(jié)果:

這里并沒(méi)有在spring-config.xml中添加id,但是依舊能正確運(yùn)行。是因?yàn)锧Controller注解自動(dòng)的起到了一個(gè)id的作用。作用與如下代碼一致:

    <bean id="userController" class="org.example.UserController"></bean>

2.@service(服務(wù)存儲(chǔ))

使用@service存儲(chǔ)Bean的代碼如下所示:

@Service
public class UserService {
    public void doService(){
        System.out.println("doService");
    }
}

在App中讀取上面的UserService對(duì)象:

public class App {
    public static void main(String[] args) {
        ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml");
        UserService userService=(UserService) context.getBean("userService");
        userService.doService();
    }
}

3.@Repository(倉(cāng)庫(kù)存儲(chǔ))

使用@Repository存儲(chǔ)Bean的代碼如下所示:

@Repository
public class UserRepository {
    public void sayHi(){
        System.out.println("hi,repository");
    }
}

在App中讀取上面的UserRepository對(duì)象:

public class App {
    public static void main(String[] args) {
        ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml");
        UserRepository userRepository=(UserRepository) context.getBean("userRepository");
        userRepository.sayHi();
    }
}

4.@Component(組件存儲(chǔ))

使用@Component存儲(chǔ)Bean的代碼如下所示:

@Component
public class UserComponent {
    public void sayHi(){
        System.out.println("hi,component");
    }
}

在App中讀取上面的UserComponent對(duì)象:

public class App {
    public static void main(String[] args) {
        ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml");
        UserComponent userComponent=(UserComponent) context.getBean("userComponent");
        userComponent.sayHi();
    }
}

5.@Configuration(配置存儲(chǔ))

使用@Configuration存儲(chǔ)Bean的代碼如下所示:

@Configuration
public class UserConfiguration {
    public void doConfiguration(){
        System.out.println("hi,Configuration");
    }
}

在App中讀取上面的UserConfiguration對(duì)象:

public class App {
    public static void main(String[] args) {
        ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml");
        UserConfiguration userConfiguration=(UserConfiguration) context.getBean("userConfiguration");
        userConfiguration.doConfiguration();
    }
}

3.為什么這么多類注解

由以上對(duì)每個(gè)注解的介紹,可以看出,這些注解的功能都是一樣的,那么為什么需要這么多類注解呢?

其目的就是讓程序員看到類注解之后,就能直接了解當(dāng)前類的用途。

@Controller:表示業(yè)務(wù)邏輯層,通常是指程序的入口,比如:參數(shù)校驗(yàn),參數(shù)類型轉(zhuǎn)換等前置處理工作。

@Service:服務(wù)層,一般寫業(yè)務(wù)代碼,服務(wù)編排,比如:調(diào)用DB,調(diào)用第三方接口。

@Repository:持久層,倉(cāng)庫(kù),通常指DB操作相關(guān)的代碼。(通常放在DAO層下面)

@Component:其它的對(duì)象。

@Configuration:配置層。

程序的工程分層,調(diào)用流程如下:

1.類注解之間的關(guān)系

查看 @Controller / @Service / @Repository / @Configuration 等注解的源碼發(fā)現(xiàn):

 其實(shí)這些注解??都有?個(gè)注解 @Component,說(shuō)明它們本身就是屬于 @Component 的“子類”。

4.方法注解@Bean

1.方法注解要搭配類注解使用

在 Spring 框架的設(shè)計(jì)中,?法注解 @Bean 要配合類注解才能將對(duì)象正常的存儲(chǔ)到 Spring 容器中,如下代碼所示:

@Configuration
public class BeanConfig {
    @Bean
    public User user() {
        User user=new User();
        user.setName("溫溫");
        user.setAge(18);
        return user;
    }
}

注意:@Bean對(duì)應(yīng)生產(chǎn)的bean名稱是方法名

2.重命名Bean

可以通過(guò)設(shè)置name屬性給Bean對(duì)象進(jìn)行重命名操作,如下對(duì)象所示:

@Configuration
public class BeanConfig {
    @Bean(name={"wen","user"})
    public User user() {
        User user=new User();
        user.setName("溫溫");
        user.setAge(18);
        return user;
    }
}

此時(shí)使用wen和user都可以獲取到User對(duì)象了:

        User user=(User) context.getBean("wen");
        System.out.println(user.getName());

2.Spring的讀取------獲取Bean對(duì)象(對(duì)象裝配)

獲取 bean 對(duì)象也叫做對(duì)象裝配,是把對(duì)象取出來(lái)放到某個(gè)類中,有時(shí)候也叫對(duì)象注?。

對(duì)象裝配(對(duì)象注?)的實(shí)現(xiàn)?法以下 3 種:

1. 屬性注?

2. 構(gòu)造?法注?

3. Setter 注?

1.屬性注入

屬性注?是使? @Autowired 實(shí)現(xiàn)的,將 Service 類注?到 Controller 類中。

Service類的代碼如下:

@Service
public class UserService {
    public void doService(){
        System.out.println("doService");
    }
}

Controller類的實(shí)現(xiàn)代碼如下:

@Controller
public class UserController {
    @Autowired
    private UserService userService;
    public void sayHi(){
        userService.doService();
        System.out.println("hi,userController~");
    }
}

最終結(jié)果如下:

2.構(gòu)造方法注入

構(gòu)造方法注入是在類的構(gòu)造方法中實(shí)現(xiàn)注入,實(shí)現(xiàn)代碼如下:

@Controller
public class UserController2 {
    private UserService us;
    public UserController2(UserService us) {
        this.us = us;
    }
    public void sayHi(){
        us.doService();
        System.out.println("hi,userController~");
    }
}

注意:1.如果只有一個(gè)構(gòu)造方法,那么@Autowired可以省略

           2.如果有多個(gè)構(gòu)造方法,那么需要添加上@Autowired來(lái)明確指定到底使用哪個(gè)構(gòu)造方法,否則程序會(huì)報(bào)錯(cuò)。

3.Setter注入

Setter 注?和屬性的 Setter ?法實(shí)現(xiàn)類似,只不過(guò)在設(shè)置 set ?法的時(shí)候需要加上 @Autowired 注

解,如下代碼所示:

@Controller
public class UserController1 {
    private UserService us;
    @Autowired
    public void setUs(UserService us) {
        this.us = us;
    }
    public void sayHi(){
        us.doService();
        System.out.println("hi,userController~");
    }
}

4.三種注入方法的優(yōu)缺點(diǎn)

優(yōu)點(diǎn)缺點(diǎn)
屬性注入簡(jiǎn)介,使用方便

補(bǔ)充:final修飾的屬性,需要具備下列兩個(gè)條件之一:

1.初始化賦值

2.構(gòu)造函數(shù)賦值

 5.@Resource:另一種注入關(guān)鍵字

在進(jìn)?類注?時(shí),除了可以使? @Autowired 關(guān)鍵字之外,我們還可以使? @Resource 進(jìn)?注?,如下代碼所示:

@Controller
public class UserController3 {
    @Resource
    private UserService us;
    public void sayHi(){
        us.doService();
        System.out.println("hi,userController~");
    }
}

@Resource和@Autowired的區(qū)別

  • 出身不同:@Autowired來(lái)自于Spring,? @Resource 來(lái)?于 JDK 的注解;
  • 使?時(shí)設(shè)置的參數(shù)不同:相?于 @Autowired 來(lái)說(shuō),@Resource ?持更多的參數(shù)設(shè)置,例如 name 設(shè)置,根據(jù)名稱獲取 Bean。
  • @Autowired 可?于 Setter 注?、構(gòu)造函數(shù)注?和屬性注?,? @Resource 只能?于 Setter 注?和屬性注?,不能?于構(gòu)造函數(shù)注?。

補(bǔ)充:

@Autowired

根據(jù)類型來(lái)獲取bean,如果同一個(gè)類型的bean只有一個(gè),直接注入成功

如果同一個(gè)類型的bean有多個(gè),以名稱匹配,注入相同名稱的bean

如果沒(méi)有名稱相同的,就報(bào)錯(cuò)

6.同一類型多個(gè)@Bean報(bào)錯(cuò)

1.現(xiàn)象

當(dāng)出現(xiàn)以下多個(gè) Bean,返回同?對(duì)象類型時(shí)程序會(huì)報(bào)錯(cuò),如下代碼所示:

@Component
public class Users {
 @Bean
 public User user1() {
 User user = new User();
 user.setId(1);
 user.setName("Java");
 return user;
 }
 @Bean
 public User user2() {
 User user = new User();
 user.setId(2);
 user.setName("MySQL");
 return user;
 }
}

在另一個(gè)類中獲取User對(duì)象:

@Controller
public class UserController4 {
 // 注?
 @Resource
 private User user;
 public User getUser() {
 return user;
 }
}

報(bào)錯(cuò)了,報(bào)錯(cuò)原因?yàn)椋悍俏ㄒ坏腂ean對(duì)象

 2.報(bào)錯(cuò)處理

解決同?個(gè)類型,多個(gè) bean 的解決?案有以下兩個(gè):

使? @Resource(name="user1") 定義。 使? @Qualifier 注解定義名稱。 使? @Resource(name="xxx")

使? @Qualifier

到此這篇關(guān)于Spring使用注解更簡(jiǎn)單的讀取和存儲(chǔ)對(duì)象的文章就介紹到這了,更多相關(guān)spring讀取和存儲(chǔ)對(duì)象內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot實(shí)現(xiàn)熱部署Community的示例代碼

    SpringBoot實(shí)現(xiàn)熱部署Community的示例代碼

    本文主要介紹了SpringBoot實(shí)現(xiàn)熱部署Community的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Java的面向?qū)ο缶幊袒靖拍顚W(xué)習(xí)筆記整理

    Java的面向?qū)ο缶幊袒靖拍顚W(xué)習(xí)筆記整理

    這篇文章主要介紹了Java的面向?qū)ο缶幊袒靖拍顚W(xué)習(xí)筆記整理,包括類與方法以及多態(tài)等支持面向?qū)ο笳Z(yǔ)言中的重要特點(diǎn),需要的朋友可以參考下
    2016-01-01
  • springboot做代理分發(fā)服務(wù)+代理鑒權(quán)的實(shí)現(xiàn)過(guò)程

    springboot做代理分發(fā)服務(wù)+代理鑒權(quán)的實(shí)現(xiàn)過(guò)程

    這篇文章主要介紹了springboot做代理分發(fā)服務(wù)+代理鑒權(quán)的實(shí)現(xiàn)過(guò)程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • HttpClient POST請(qǐng)求第三方接口問(wèn)題(多參數(shù)傳參)

    HttpClient POST請(qǐng)求第三方接口問(wèn)題(多參數(shù)傳參)

    這篇文章主要介紹了HttpClient POST請(qǐng)求第三方接口問(wèn)題(多參數(shù)傳參),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Maven?dependency?plugin使用心得總結(jié)

    Maven?dependency?plugin使用心得總結(jié)

    這篇文章主要給大家介紹了關(guān)于Maven?dependency?plugin使用心得的相關(guān)資料,Maven是一個(gè)常用的Java build Manager,使用Maven可以很好的對(duì)Java Project的dependency進(jìn)行管理,需要的朋友可以參考下
    2023-10-10
  • Java語(yǔ)言實(shí)現(xiàn)最大堆代碼示例

    Java語(yǔ)言實(shí)現(xiàn)最大堆代碼示例

    這篇文章主要介紹了Java語(yǔ)言實(shí)現(xiàn)最大堆代碼示例,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-12-12
  • Java中的線程池ThreadPoolExecutor深入解析

    Java中的線程池ThreadPoolExecutor深入解析

    這篇文章主要介紹了Java中的線程池ThreadPoolExecutor深入解析,線程池,thread pool,是一種線程使用模式,線程池維護(hù)著多個(gè)線程,等待著監(jiān)督管理者分配可并發(fā)執(zhí)行的任務(wù),需要的朋友可以參考下
    2023-11-11
  • MyBatis-Plus中AutoGenerator的使用案例

    MyBatis-Plus中AutoGenerator的使用案例

    AutoGenerator是MyBatis-Plus的代碼生成器,通過(guò)?AutoGenerator?可以快速生成?Pojo、Mapper、?Mapper?XML、Service、Controller?等各個(gè)模塊的代碼,這篇文章主要介紹了MyBatis-Plus中AutoGenerator的詳細(xì)使用案例,需要的朋友可以參考下
    2023-05-05
  • 詳解Idea中HTTP Client請(qǐng)求測(cè)試工具的使用

    詳解Idea中HTTP Client請(qǐng)求測(cè)試工具的使用

    今天抽空給大家分享Idea中HTTP Client請(qǐng)求測(cè)試工具的使用,小編在這建議使用HTTP Client的Idea版本最好在2018以上,不然的話體驗(yàn)不是多好,今天就給大家介紹Idea中HTTP Client怎么使用的,感興趣的朋友跟隨小編一起看看吧
    2021-05-05
  • IDEA教程創(chuàng)建SpringBoot前后端分離項(xiàng)目示例圖解

    IDEA教程創(chuàng)建SpringBoot前后端分離項(xiàng)目示例圖解

    在使用spring、mybatis等框架時(shí),配置文件很復(fù)雜,有時(shí)復(fù)雜的讓人想放棄Java,使用C#。springboot出現(xiàn)這一切問(wèn)題就都不是問(wèn)題
    2021-10-10

最新評(píng)論