Spring6
Spring專案的創建
-
打開IDEA,新建一個maven專案
-
在maven專案中引入spring的倉庫和依賴
<repositories> <repository> <id>repository.spring.milestone</id> <name>Spring Milestone Repository</name> <url>https://repo.spring.io/milestone</url> </repository> </repositories> <dependencies> <!--spring6--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>6.0.3</version> </dependency> </dependencies> -
撰寫Spring組態檔,
- maven成功引入Spring之后,在resource目錄下新建一個Spring組態檔,名稱任意,
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- spring 組態檔,名字任意,最好放在根目錄下,方便后期移植--> </beans> -
配置bean
- 在Java目錄下新建一個類,在Spring6組態檔中配置bean
<!-- 配置bean,這樣spring才能幫助我們管理這個物件--> <!-- bean標簽有兩個重要的屬性,--> <!-- --id 是bean的唯一標志,不能重復--> <!-- --class 必須是全路徑,全限定類名(帶包名的類名)--> <bean id="studentBean" /> -
撰寫測驗程式
- 引入junit依賴
- 撰寫測驗程式
package com.winter.spring6.test; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; /** * @author Winter * @version 1.0 * @since 1.0 */ public class FirstSrpingTest { @Test public void testFristSpringCode(){ // 第一步 獲取spring容器物件 // ApplicationContext 翻譯為應用背景關系,其實就是spring容器 // ApplicationContext是一個介面,該介面下有很多實作類,其中一個就是ClassPathXmlApplicationContext // ClassPathXmlApplicationContext是專門從類路徑加載spring組態檔的背景關系物件 ApplicationContext context = new ClassPathXmlApplicationContext("Spring.xml"); // 第二步 根據bean的id從這個spring容器中獲取這個物件 Object studentBean = context.getBean("studentBean"); System.out.println(studentBean); } }控制臺輸出:
com.winter.spring6.bean.studentBean@158d2680表示第一個Spring程式完成,Spring成功創建了一個student物件
第一個Spring程式的一些小細節
-
bean標簽的id屬性不可以重復
-
底層是怎樣創建物件的?
-
默認情況下Spring會通過反射機制,呼叫類的無引數構造方法來實體化物件
-
Class clazz = Class.forName("com.winter.spring6.bean.student") Object obj = clazz.newInstance(); -
要想讓Spring幫你創建物件,那么就必須保證有無引數構造方法,
-
-
創建好的物件都存放在什么樣的資料結構中?
- Map<String , Object>
-
Spring的組態檔名稱不是固定的,想寫啥寫啥,但是要和下面代碼中填入的字串一致
ApplicationContext context = new ClassPathXmlApplicationContext("Spring.xml"); -
Spring的組態檔可以有多個
ApplicationContext context = new ClassPathXmlApplicationContext("Spring1.xml","Spring2.xml"); -
組態檔中配置的類不一定是自定義的,也可以是JDK中的類
<bean id="dataBean" /> -
getBean() 方法呼叫時,如果指定的id不存在時,不會回傳null而是會報錯,
-
getBean() 方法回傳的型別時Object,如果訪問子類特有屬性和方法時,使用時必須向下轉型
或者是在getBean() 方法傳入第二個引數,XXXX.class(指定要回傳的型別)
User user = ApplicationContext.getBean("userBean",User.class); -
如果是從絕對路徑呼叫spring組態檔,那么就需要
ApplicationContext context = new FileSystemXmlApplicationContext("D:/Spring1.xml"); -
查閱原始碼可知,ApplicationContext有一個父介面是ListableBeanFactory,ListableBeanFactory的父介面是BeanFactory
BeanFactory是Ioc容器的頂級介面
Spring的IoC容器底層實際上使用了工廠模式,Spring底層的IoC是通過 XML決議+工廠模式+反射機制
-
實體化物件的時機:當以下代碼執行時就會實體化物件
new ClassPathXmlApplicationContext("spring6.xml");
啟用Log4j2日志框架
- 第一步:引入log4j2的依賴
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.19.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j2-impl</artifactId>
<version>2.19.0</version>
</dependency>
- 第二步:在類的根路徑下提供log4j2組態檔(檔案名固定為log4j2.xml,檔案必須被放到類根路徑下)
<?xml version="1.0" encoding="UTF-8"?>
<configeration>
<loggers>
<!-- level指定日志級別,從低到高的優先級:
ALL < TRACE < DEBUG < WARN < ERROR < FATAL < OFF
-->
<root level="DEBUG">
<appender-ref ref="spring6log"/>
</root>
</loggers>
<appenders>
<!-- 輸出日志資訊到控制臺 -->
<console name="spring6log" target="SYSTEM_OUT">
<!-- 日志輸出的格式 -->
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm} [%t] %-3levle %logger{1024} -%msg%n"/>
</console>
</appenders>
</configeration>
- 第三步:使用日志框架
Logger logger = LoggerFactory.getLogger(FirstSpringtest.class);//在哪個類里面就傳什么引數
loggee.info("輸入你想記錄日志的內容")
依賴注入
構造注入
通過呼叫構造方法來給屬性賦值,在bean標簽里面添加constructor-arg標簽
<!-- 構造注入 通過index指定引數 -->
<!--
index 屬性指定引數下標,第一個引數下標是0
ref 屬性用于指定注入bean的id
-->
<constructor-arg index="0" ref="userDaoBean"/>
<!-- 構造注入 通過name指定引數 -->
<!-- name屬性是引數的名字 -->
<constructor-arg name ref="userDaoBean"/>
<!-- 構造注入 spring自己做型別匹配 -->
<!-- 不指定下標也不指定引數名 -->
<constructor-arg name ref="userDaoBean"/>
set注入
set注入的話,必須提供一個set方法,spring會呼叫這個set方法,來給userDao賦值,
想要讓spring呼叫對應的set方法,需要配置property標簽
<!-- set注入 需要配置property標簽 -->
<!--
name屬性是 set方法的方法名,去掉set,然后首字母變成小寫 Eg: setAbcd()-----abcd
ref 屬性用于指定注入bean的id
-->
<!-- set方法起名最好是按照規范,一般借助IDEA自動生成 -->
<proprety name="xxxx" ref="userDaoBean"/>
set注入專題
注入外部Bean
之前的幾個例子就是外部注入:
外部bean的特點:bean定義在外面,然后在property標簽中通過ref屬性引入
注入內部Bean
在Bean標簽中嵌套bean標簽
<bean id="studentBean" >
<property name="userDao">
<bean />
</property>
</bean>
注入簡單型別
在property標簽中 使用value屬性給簡單型別賦值
<!-- value 屬性用于給簡單型別賦值 -->
<proprety name="xxxx" value="https://www.cnblogs.com/winterqq/archive/2023/01/17/123"/>
什么是簡單型別?
使用IDEA查找Beanutils類,然后找到isSimpleValueType方法,查看里面的代碼可知
- 基本型別
- 包裝類
- 列舉類
- 字串型別
- 數字
- 日期Date
- 時間、時區Temporal
- URI、URL
- 語言local
- Class
簡單型別的應用:讓spring去管理資料源
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/542133.html
標籤:其他
