Spring更简单的存储对象------不使用XML而使用注解
?1.更簡單進行存儲:
1.先進行創建Spring的項目
先進行創建maven項目,在pom.xml里面引入對Spring所依賴的jar包(核心包:5.2.3)
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.3.RELEASE</version></dependency><!-- https://mvnrepository.com/artifact/org.springframework/spring-beans --><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>5.2.3.RELEASE</version></dependency>2.配置Spring的XML文件:在resouces下面創建一個xml文件,引入下面的這段代碼
1)配置web.xml,進行設置spring存入對象的根路徑也就是掃描路徑,它的一個目的就是為了:當Spring項目啟動之后,可以去根路徑下的所有類中掃描并將其標識為需要存儲到Spring中的對象存儲到Spring里面-----還是在resource目錄下進行分配 <?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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsd"> <content:component-scan base-package="APP">//存儲根路徑 <!--把APP下面的類讓Spring啟動的時候都去掃描一下,配置Spring掃描的根路徑, 此根路徑下的所有的Spring存對象的注解才可以生效, 看看哪一個類需要存入到Spring里面--> 所有要存放到Spring的對象都放在這個根路徑</content:component-scan></beans><content:component-scan base-package="APP">組鍵的掃描地址,存儲所有掃描類的根路徑
1)把APP包下面的類讓Spring啟動的時候都去掃描一下,配置Spring掃描的根路徑;
2)此根路徑下的所有的Spring存對象的注解才可以生效,看看哪一個類需要存入到Spring里面;
總結:
3)Spring在一開始啟動的時候并不會掃描所有的包,掃描所有的類,只會從base-package這個根路徑里面找;
4)配置Spring xml文件的時候,我們要配置Spring組件掃描路徑,只有在這個路徑里面,被注解修飾過的類(對象)才會被放到Spring里面;
5)創建一個普通類,添加main方法,主要的作用就是方便于我們進行調試----進行測試的一種方式
注意:
2)只有根路徑也就是組件路徑下面的類才有可能被存入到Spring里面
3)添加注解修飾Bean對象才可以存入到到Spring框架里面
4)存儲:-----使用注解
注解分類:表示根路徑下面的需要存儲在Spring中的對象,需要用注解進行標識
1)類注解:@Controller(控制器),@Service(業務處理),@Repository(數據持久類),因為這些不同的注解描述的業務場景是不一樣的
2)方法注解:@Bean
1)Controller控制器:當我們的前端訪問后端的時候,首先就會先進入到控制器針對前端的訪問參數做一個校驗,如果參數檢測不正確或者是一個非法請求,那么直接返回給前端,不會進行處理業務;只有Controller控制層的參數校驗通過了,才可以執行接下來的代碼;
2)Service叫做業務邏輯層:主要的功能就是根據業務常景來做數據組裝的和接口的調用的,假設你進行注冊功能,我要向用戶表里面添加一條數據,向日志表里面添加一條數據,就要調用兩個接口
3)Repository(倉庫)---->數據存儲層:進行數據保存和數據查詢----會與數據庫進行連接和交互,調用JDBC的驅動,數據庫表的基本增刪改查操作
1)然后把查詢數據向上傳遞,最終Controller把結果返回給前端,前端進行渲染,展示出頁面效果;
2)這些注解主要就是為了讓程序員看到注解之后,可以更好地了解到當前的類的用途,代碼的可讀性提高,也就是讓程序員更好的看到這些類的業務用途
1)@Controller是一個組合注解,從業務邏輯來說,我們可以認為Controller是Component的一個子類?
2)這些注解全部是Component的子類
有這么多注解是為了成需要更方便的看代碼的,是為了讓程序員知道這些類是干什么的;
3)對于方法名/類名來說,類名名字符大于2個,并且前兩個字符都是大寫,那么使用原來的類名作為Bean的名字;大駝峰命名規則,那么就將首字母小寫;
4)@Configuration(配置)配置系統的配置信息,當前實際業務項目中所有的配置,我們都要建一個新的包,把所有的配置信息全部放在這里面,當我們進行修改配置,維護配制的時候,只需要在這一層找就可以了
5)@Component(組件):公共的工具類,沒有辦法把它放到其他任何一個的、層里面,所以就把它放到這個注解;
這樣我們就可以通過使用注解的方式來進行代替原來XML使用bean標簽注冊的方式來進行將bean對象注冊到Spring里面了?
@Controller,@Service,@Repository,@Configuration都是基于@Component實現的,所以@Component可以認為是其他6個注解的父類
2.使用注解實現對象存儲在Spring框架里面之后,通過Spring上下文來進行獲取Bean對象
1)方法注解必須配合類注解進行使用
Spring上下文對象.getBean("類名(首字母小寫或者是正常的類名)",類名.class);
2)當我們已經通過配置掃描路徑和注解添加到類名上面來進行更簡單的存儲Bean對象之后,我們還要想辦法來進行獲取到這個類對象
3)我們在這里面還是想要通過傳統的通過Spring上下文的方式來進行獲取到Bean對象
4)類名首字母和第二個字母都是非大寫,那么通過GetBean()方法的時候需要通過類名來進行獲取到Bean對象的時候,類名就不能使用原來的類名了,而是通過類名首字母小寫的方式來進行獲取到bean
5)如果說首字母和第二個字母都是大寫況且名字的長度大于1,那么直接使用原Bean名,來進行獲取,不滿足這個條件,就讓原Bean名首字母小寫
?1.獲取到被@Controller修飾的Bean對象,下面就更簡單的將Bean對象存儲到Spring里面了
1)加上掃描路徑:
2)加上注解:
3)如果不加注解或者不加掃描路徑
NoSuchBeanDefinitionException: No bean named 'userController' available
UserController里面的代碼: package APP; import org.springframework.stereotype.Controller; @Controller public class UserController {public void run(){System.out.println("我是被Controller注解修飾的UserController類的run方法");} }?
打印結果:我是被Controller注解修飾的UserController類的run方法,上面是根據ID和類名來進行獲取的
注意事項:
1)讀取存入對象的id:默認情況下是首字母小寫
2)關于存儲目錄:所有需要存儲到Spring框架中的對象的目錄,必須在Spring配置文件(XML)文件配置的目錄下(component-scan目錄下)
存入到Spring里面的內容是一個鍵值對:Key值是被注解修飾過的類名的首字母的小寫形式,Value就是類名
??2.獲取到被@Service修飾的Bean對象
下面是UserService里面的代碼:
package APP; import org.springframework.stereotype.Service; @Service public class UserService {public void run(){System.out.println("我是被Service修飾的類的UserService方法");} }??3.獲取到被@Resposity修飾的Bean對象
下面這個是APP包中的UserResposity中的代碼: package APP; import org.springframework.stereotype.Repository; @Repository public class UserResposity{public void run(){System.out.println("我是被@Repository修飾的類的run方法");} }?4.使用@Configuration來進行修飾
這是APP包下面的UserConfiguration類的代碼: package APP; import org.springframework.context.annotation.Configuration; @Configuration public class UserConfiguration {public void start(){System.out.println("我是有@Configuration注解修飾的類的start()方法");} }?5.進行獲取到@Component修飾的類
package APP; import org.springframework.stereotype.Component; @Component public class UserComponet {public void start(){System.out.println("我是被@Component修飾的類的start()方法");} } import APP.UserComponet; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class HelloWorld {public static void main(String[] args) {//1.先進行獲取到Spring的上下文對象ApplicationContext context=new ClassPathXmlApplicationContext("web.xml");//2.獲取到Bean對象UserComponet componet=context.getBean("userComponet",UserComponet.class);//3.使用Bean對象componet.start();} }使用方法注解@Bean將對象更加簡單的存儲到容器里面:
1)方法名稱+方法返回值的class也就是類對象
2)注意事項:Spring默認情況下是類掃描,默認是類注解而不是方法注解,因此如果使用的是方法注解@Bean,那么就必須要配合類注解進行使用,這個類注解可以是五大類注解任意一個,通常情況下就是搭配@Component組件和Bean一塊進行使用才可以將方法返回對象存儲到Spring里面
//1.咱們首先創建一個類,一會作為方法的返回值 public class User {public int id;public String name;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "User{" +"id=" + id +", name='" + name + '\'' +'}';} }//2.再進行創建一個類,里面寫一個方法 @Component public class GetBean {@Bean//將當前對象存儲到Spring里面public User GetUser(){User user=new User();user.setId(1);user.setName("李佳偉");return user;} } //3.咱們啟動類的main方法ApplicationContext context=new ClassPathXmlApplicationContext("web.xml");User user=context.getBean("GetUser",User.class); User user=(User)context.getBean("GetUser"); //第一個參數表示的是方法名,第二個參數表示的返回對象的類對象System.out.println(user);或者寫這種方法也可以:?
?@Component public class GetBean {@Bean(name ="u1")//將當前User對象存儲到Spring里面public User GetUser(){User user=new User();user.setId(1);user.setName("李佳偉");return user;} } //這時候可以進行不關注方法名 ApplicationContext context=new ClassPathXmlApplicationContext("web.xml");User user=context.getBean("u1",User.class);System.out.println(user); 但是我們寫了@Bean(name = "u1")之后,寫這個方法就會發生報錯User user=context.getBean("GetUser",User.class)?@Configuration:配置攔截器就在這個層
@Bean注解
1)為了減少掃描的范圍,增加框架加載速度,即使你已經在方法注解上面加了bean你還要在這個方法所在的類上面配合5大類注解進行使用,這樣才可以將一個方法對象存儲到Spring中,如果你只寫了方法注解而沒有在類上面寫類注解,那么這個時候方法返回的對象是不能存放在Spring里面的
2)為了獲取這個返回的對象,我們使用的是方法名+方法返回值的類對象,而不是通過大駝峰的方式來進行獲取
3)此時我們想要獲取@Bean修飾方法的返回值,也是可以只通過類對象來進行獲取的(上一篇博客的截圖)
1)我們使用@Bean注解來將到方法返回值注冊到Spring里面,這里面的ID就變成了方法名,我們仍然可以通過傳統的方式來進行獲取到這個Bean對象:
1)Spring的上下文對象.getBean(方法名字,方法的返回值/要被存儲到Spring的返回值的類對象)-------通過ID和類對象來進行獲取
2)Spring的上下文對象.getBean(方法名字)------通過ID來進行獲取
3)Spring的上下文對象.getBean(返回值的類對象)-----通過類對象來進行獲取
2)當我們使用類名.class的方式來進行嘗試獲取返回值(也就是已經存到Spring中的返回值對象,當多個不同的方法的返回值相同的時候,就會發生報錯)
User里面的代碼: package APP; public class User {public String username;public String password;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}@Overridepublic String toString() {return "User{" +"username='" + username + '\'' +", password='" + password + '\'' +'}';} }
UserDemo里面的代碼:
package APP;import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Controller;@Controller public class UserDemo {@Beanpublic User GetUser1(){User user=new User();user.username="李佳偉";user.password="12503487";return user;}@Beanpublic User GetUser2(){User user=new User();user.username="李嘉欣";user.password="178";return user;} }當我們進行運行上述代碼的時候,會出現報錯,仔細想一想也是,當多個方法的返回值都是User的時候,你的程序只是想通過User.class獲取,此時會返回多個User對象呀!
解決方法:
1)通過ID和類名或者只通過ID來進行獲取
2)使用特殊的注解方法:況且之前的寫法看起來就很別扭,你說獲取到Bean對象要寫方法的名字,這樣就很不好,所以我們通過下面的方式來進行更簡單的獲取到@Bean修飾方法的返回值:
package APP; public class User {public String username;public String password;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}@Overridepublic String toString() {return "User{" +"username='" + username + '\'' +", password='" + password + '\'' +'}';} } package APP; import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Controller; @Controller public class UserDemo {@Bean(name = "u1")public User GetUser1(){User user=new User();user.username="李佳偉";user.password="12503487";return user;}@Bean(name = "u2")public User GetUser2(){User user=new User();user.username="李嘉欣";user.password="178";return user;} } public static void main(String[] args) { //1.先進行獲取到Spring的上下文對象 ApplicationContext context=new ClassPathXmlApplicationContext("web.xml"); //2.在進行獲取到Bean對象User users= (User) context.getBean("u1"); //3.打印Bean對象System.out.println(users);} @Bean(name = {"u1","kkkk"});總結:
1)咱們在一開始使用Spring的時候,知道了要存入的Spring的鍵值對是HashMap<XML生命的ID,要存入類的類對象>();
2)咱們后來再次學習5大類注解之后,學習到了更簡單的存儲對象到Spring里面,此時的鍵值對就變成了:HashMap<"被5大類注解修飾的類名或者類名變成首字母小寫“,被5大類注解修飾的類的類對象>
3)后面又學習了方法注解,存儲在Spring的鍵值對就相當于是HashMap<方法名,被@Bean注解修飾的方法返回值的類對象>
4)給我們的Bean修飾的方法加上名字之后,存儲在Spring中的鍵值對就類似于:
HashMap<指定的名字name屬性,被@Bean注解修飾的方法返回值的類對象>
5)咱們的Bean的命名規則,當我們沒有進行設置name屬性的時候,那么Bean默認的名稱就是方法名,但是當name設置了屬性之后,我們只能通過name屬性對應的值來進行獲取,也就是說當重命名之后,在使用方法名就也獲取不到這個@Bean對象了
6)@Bean將一個類型的對象注入多次的問題:
解決方法:
1)精準的描述被@bean修飾的名稱,通過方法名或者方法名+返回值的類對象來進行獲取Bean對象:Spring上下文對象.getBean(方法名,返回值類名.class)
2)使用@Autowired或者@Resource修飾注入方式,就拿上面這個例子來說寫成:
@Autowired private User GetUser;//把這個引用換成對應的方法名?
?
?
package APP; public class User {public String username;public String password;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}@Overridepublic String toString() {return "User{" +"username='" + username + '\'' +", password='" + password + '\'' +'}';} }3)使用指定@Bean別名的方式來進行獲取到Bean對象
總結
以上是生活随笔為你收集整理的Spring更简单的存储对象------不使用XML而使用注解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html图片的宽度和高度设置,CSS设置
- 下一篇: [.NET基础]走进各种位运算