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

Spring使用注解更簡單的讀取和存儲對象的方法

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

在上一篇文章中實現(xiàn)了基本的Spring讀取和存儲對象。但在操作的過程中我們發(fā)現(xiàn)讀取和存儲對象并沒有想象中的那么“簡單”。

所以接下來我們要講解更加簡單的操作 Bean 對象的?法。其核心就是,使用注解。

1.Spring的存儲對象------存儲Bean對象

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

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

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

                  2.否則,首字母小寫

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

想要將對象成功的存儲到 Spring 中,我們需要配置?下存儲對象的掃描包路徑,只有被配置的包下的所有類,添加了注解才能被正確的識別并保存到 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)紅的一行為注冊掃描的包,如下圖所示:

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

2.添加注解存儲Bean對象

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

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

2. ?法注解:@Bean。

1.@Controller(控制器存儲)

使用@Controller存儲Bean的代碼如下所示:

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

在App中讀取上面的UserController對象:

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

運行結(jié)果:

這里并沒有在spring-config.xml中添加id,但是依舊能正確運行。是因為@Controller注解自動的起到了一個id的作用。作用與如下代碼一致:

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

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

使用@service存儲Bean的代碼如下所示:

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

在App中讀取上面的UserService對象:

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(倉庫存儲)

使用@Repository存儲Bean的代碼如下所示:

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

在App中讀取上面的UserRepository對象:

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(組件存儲)

使用@Component存儲Bean的代碼如下所示:

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

在App中讀取上面的UserComponent對象:

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(配置存儲)

使用@Configuration存儲Bean的代碼如下所示:

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

在App中讀取上面的UserConfiguration對象:

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.為什么這么多類注解

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

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

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

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

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

@Component:其它的對象。

@Configuration:配置層。

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

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

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

 其實這些注解??都有?個注解 @Component,說明它們本身就是屬于 @Component 的“子類”。

4.方法注解@Bean

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

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

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

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

2.重命名Bean

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

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

此時使用wen和user都可以獲取到User對象了:

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

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

獲取 bean 對象也叫做對象裝配,是把對象取出來放到某個類中,有時候也叫對象注?。

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

1. 屬性注?

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

3. Setter 注?

1.屬性注入

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

Service類的代碼如下:

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

Controller類的實現(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)造方法中實現(xiàn)注入,實現(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òu)造方法,那么@Autowired可以省略

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

3.Setter注入

Setter 注?和屬性的 Setter ?法實現(xiàn)類似,只不過在設(shè)置 set ?法的時候需要加上 @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)缺點

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

補充:final修飾的屬性,需要具備下列兩個條件之一:

1.初始化賦值

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

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

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

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

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

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

補充:

@Autowired

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

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

如果沒有名稱相同的,就報錯

6.同一類型多個@Bean報錯

1.現(xiàn)象

當(dāng)出現(xiàn)以下多個 Bean,返回同?對象類型時程序會報錯,如下代碼所示:

@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;
 }
}

在另一個類中獲取User對象:

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

報錯了,報錯原因為:非唯一的Bean對象

 2.報錯處理

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

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

使? @Qualifier

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

相關(guān)文章

  • 微信APP支付(IOS手機端+java后臺)版

    微信APP支付(IOS手機端+java后臺)版

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

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

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

    ??Spring Boot SPI 用法教程?

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

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

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

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

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

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

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

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

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

    原理分析Java?Mybatis中的Mapper

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

    jedis的borrow行為方法源碼解讀

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

    springboot新建項目jdk只有17/21,無法選中1.8解決辦法

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

最新評論

秦安县| 泸州市| 丹江口市| 威信县| 华安县| 宁河县| 图们市| 永顺县| 璧山县| 新巴尔虎左旗| 长治市| 宝清县| 本溪市| 宁晋县| 武定县| 高台县| 韶山市| 凤城市| 唐海县| 汽车| 遵化市| 大新县| 武义县| 尼木县| 新和县| 龙州县| 大连市| 平武县| 大宁县| 菏泽市| 和田市| 樟树市| 漠河县| 新泰市| 图木舒克市| 荥阳市| 且末县| 容城县| 安吉县| 苍山县| 比如县|