最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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è)注解就可以替代之前要寫(xiě)??配置的尷尬了。

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

                  2.否則,首字母小寫(xiě)

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

想要將對(duì)象成功的存儲(chǔ)到 Spring 中,我們需要配置?下存儲(chǔ)對(duì)象的掃描包路徑,只有被配置的包下的所有類(lèi),添加了注解才能被正確的識(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è)掃描的包,如下圖所示:

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

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

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

1. 類(lèi)注解:@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.為什么這么多類(lèi)注解

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

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

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

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

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

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

@Configuration:配置層。

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

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

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

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

4.方法注解@Bean

1.方法注解要搭配類(lèi)注解使用

在 Spring 框架的設(shè)計(jì)中,?法注解 @Bean 要配合類(lèi)注解才能將對(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名稱(chēng)是方法名

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è)類(lèi)中,有時(shí)候也叫對(duì)象注?

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

1. 屬性注?

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

3. Setter 注?

1.屬性注入

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

Service類(lèi)的代碼如下:

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

Controller類(lèi)的實(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)造方法注入是在類(lèi)的構(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)類(lèi)似,只不過(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)?類(lèi)注?時(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ù)名稱(chēng)獲取 Bean。
  • @Autowired 可?于 Setter 注?、構(gòu)造函數(shù)注?和屬性注?,? @Resource 只能?于 Setter 注?和屬性注?,不能?于構(gòu)造函數(shù)注?。

補(bǔ)充:

@Autowired

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

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

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

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

1.現(xiàn)象

當(dāng)出現(xiàn)以下多個(gè) Bean,返回同?對(duì)象類(lèi)型時(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è)類(lèi)中獲取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è)類(lèi)型,多個(gè) bean 的解決?案有以下兩個(gè):

使? @Resource(name="user1") 定義。 使? @Qualifier 注解定義名稱(chēng)。 使? @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)文章

  • 微信APP支付(IOS手機(jī)端+java后臺(tái))版

    微信APP支付(IOS手機(jī)端+java后臺(tái))版

    這篇文章主要為大家詳細(xì)介紹了微信APP支付(IOS手機(jī)端+java后臺(tái))版,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • java之static關(guān)鍵字用法實(shí)例解析

    java之static關(guān)鍵字用法實(shí)例解析

    這篇文章主要介紹了java之static關(guān)鍵字用法實(shí)例解析,包括了static關(guān)鍵字的原理講解及用法分析,并附帶了實(shí)例說(shuō)明,需要的朋友可以參考下
    2014-09-09
  • ??Spring Boot SPI 用法教程?

    ??Spring Boot SPI 用法教程?

    文章介紹了Java SPI(服務(wù)提供者接口)和Spring Boot中的SPI機(jī)制,包括它們的定義、使用方式和實(shí)戰(zhàn)示例,文章還討論了常見(jiàn)問(wèn)題和最佳實(shí)踐,如版本兼容性、條件裝配、避免類(lèi)路徑?jīng)_突以及擴(kuò)展點(diǎn)選擇,感興趣的朋友一起看看吧
    2025-11-11
  • Sharding JDBC讀寫(xiě)分離實(shí)現(xiàn)原理及實(shí)例

    Sharding JDBC讀寫(xiě)分離實(shí)現(xiàn)原理及實(shí)例

    這篇文章主要介紹了Sharding JDBC讀寫(xiě)分離實(shí)現(xiàn)原理及實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-12-12
  • Java網(wǎng)絡(luò)編程之簡(jiǎn)易聊天室的實(shí)現(xiàn)

    Java網(wǎng)絡(luò)編程之簡(jiǎn)易聊天室的實(shí)現(xiàn)

    這篇文章主要為大家詳細(xì)介紹了如何利用Java語(yǔ)言實(shí)現(xiàn)一個(gè)簡(jiǎn)易聊天室功能,可以實(shí)現(xiàn)運(yùn)行客戶端和連接服務(wù)器,文中的示例代碼講解詳細(xì),需要的可以了解一下
    2022-10-10
  • JAVA中split函數(shù)的常見(jiàn)用法實(shí)例

    JAVA中split函數(shù)的常見(jiàn)用法實(shí)例

    Java中我們可以利用split把字符串按照指定的分割符進(jìn)行分割,然后返回字符串?dāng)?shù)組,下面這篇文章主要給大家介紹了關(guān)于JAVA中split函數(shù)的常見(jiàn)用法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • SpringMVC中RequestMapping注解(作用、出現(xiàn)的位置、屬性)

    SpringMVC中RequestMapping注解(作用、出現(xiàn)的位置、屬性)

    這篇文章主要介紹了SpringMVC中RequestMapping注解(作用、出現(xiàn)的位置、屬性),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • 原理分析Java?Mybatis中的Mapper

    原理分析Java?Mybatis中的Mapper

    這篇文章主要為大家介紹了Java?Mybatis中的Mapper,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-01-01
  • jedis的borrow行為方法源碼解讀

    jedis的borrow行為方法源碼解讀

    這篇文章主要為大家介紹了jedis的borrow行為方法源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • springboot新建項(xiàng)目jdk只有17/21,無(wú)法選中1.8解決辦法

    springboot新建項(xiàng)目jdk只有17/21,無(wú)法選中1.8解決辦法

    最近博主也有創(chuàng)建springboot項(xiàng)目,發(fā)現(xiàn)了IntelliJ IDEA在通過(guò)Spring Initilizer初始化項(xiàng)目的時(shí)候已經(jīng)沒(méi)有java8版本的選項(xiàng)了,這里給大家總結(jié)下,這篇文章主要給大家介紹了springboot新建項(xiàng)目jdk只有17/21,無(wú)法選中1.8的解決辦法,需要的朋友可以參考下
    2023-12-12

最新評(píng)論

左云县| 会东县| 许昌县| 湄潭县| 固安县| 宕昌县| 南川市| 通许县| 梅河口市| 吴旗县| 印江| 江达县| 囊谦县| 琼海市| 通榆县| 井陉县| 南充市| 海门市| 永平县| 建德市| 德钦县| 太湖县| 若尔盖县| 津南区| 大渡口区| 杭锦旗| 县级市| 连城县| 桐梓县| 河南省| 西吉县| 东光县| 临泉县| 罗定市| 米脂县| 阳信县| 武隆县| 敦煌市| 喀喇| 高平市| 黄山市|