Spring6 Spring項目的創建 打開IDEA,新建一個maven項目 在maven項目中引入spring的倉庫和依賴 <repositories> <repository> <id>repository.spring.milestone</id> <name>Spring Milestone ...
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" class="com.winter.spring6.bean.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" class="java.util.Date"/>
-
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" class="com.winter.spring6.bean.studentBean">
<property name="userDao">
<bean class="com.winter.spring6.bean.userBean"/>
</property>
</bean>
註入簡單類型
在property標簽中 使用value屬性給簡單類型賦值
<!-- value 屬性用於給簡單類型賦值 -->
<proprety name="xxxx" value="123"/>
什麼是簡單類型?
使用IDEA查找Beanutils類,然後找到isSimpleValueType方法,查看裡面的代碼可知
- 基本類型
- 包裝類
- 枚舉類
- 字元串類型
- 數字
- 日期Date
- 時間、時區Temporal
- URI、URL
- 語言local
- Class
簡單類型的應用:讓spring去管理數據源