項目目錄
1.對于Spring的了解
Spring架構是java應用最廣的架構,它的成功來源于理念,它的理念包括ioc和aop(理念:每個bean與bean之間的關系統一交給SpringIOC容器管理)。
Spring架構主要由七部分組成,分别是 Spring Core、 Spring AOP、 Spring ORM、 Spring DAO、Spring Context、 Spring Web和 Spring Web MVC
2.Spring與傳統對象管理的差別
在傳統中,我們使用對象都是通過new xxx()來進行對象的執行個體化,而在Spring架構中,一般通過掃包、注解的形式來建立對象,在建立對象的過程中,大部分使用反射機制來進行。
3.Spring注入bean的兩種方式
我們先寫出一個對象(UserEntity.java)
package com.entity;
public class UserEntity {
private String name;
private String age;
public void setName(String name) {
this.name = name;
}
public void setAge(String age) {
this.age = age;
}
@Override
public String toString() {
return "com.entity.UserEntity{" +
"name='" + name + '\'' +
", age='" + age + '\'' +
'}';
}
}
并且在pom.xml中引入依賴
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.20.RELEASE</version>
</dependency>
</dependencies>
-
xml注入
直接建立application.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 注入對象,一般使用小駝峰命名法 使用property注入對象屬性值-->
<bean id="userEntity" class="com.spring.entity.UserEntity">
<property name="name" value="小王"/>
<property name="age" value="18"/>
</bean>
</beans>
在com.spring包下建立Application.java
public class Application {
public static void main(String[] args) {
// 解析xml配置,并指定xml檔案,xml檔案預設在resource根目錄下
ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("application.xml");
// 擷取對象
UserEntity userEntity = classPathXmlApplicationContext.getBean("userEntity", UserEntity.class);
System.out.println(userEntity.toString());
}
}
運作結果:
這樣我們就可以發現xml中注入的資料也列印了
-
注解形式注入
在com.spring.config下建立MyConfig.java
package com.spring.config;
import com.spring.entity.UserEntity;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyConfig {
//@Configuration 相當于建立了spring.xml
@Bean
public UserEntity userEntity(){
return new UserEntity();
}
}
運作結果:
這樣我們也可以看到我們成功建立了UserEntity對象
當然,@Configuration注解還有着很多的用處,比如:在此注解下使用@ComponentScan(“com.spring”)就可以掃描外部包,那麼我們可以在Application.java中加入這麼一段代碼
// 擷取在MyConfig中注入的所有bean
String[] beanDefinitionNames = annotationConfigApplicationContext.getBeanDefinitionNames();
for (int i = 0; i < beanDefinitionNames.length; i++) {
System.out.println(beanDefinitionNames[i]);
}
運作結果:
這樣我們就實作了兩種注入方式,當然兩種注入方式中注入的方法各種各樣,不僅限于舉例出來的這一種。
4.對象預設是單例還是多例
答案是,預設情況下是單例的。
測試方法(在Application.java中加入以下代碼):
UserService userService1 = annotationConfigApplicationContext.getBean("userService", UserService.class);
UserService userService2 = annotationConfigApplicationContext.getBean("userService", UserService.class);
System.out.println(userService1 == userService2);
傳回結果:
這裡讓我們了解到了,對象預設為單例,那麼我們要對象變成多例要怎麼實作呢?
很簡單。在需要設定為多例的對象上加入@Scope(“prototype”)即可
5.對象的建立時餓漢式還是懶漢式
先來解釋一下,餓漢式和懶漢式。
餓漢式:在配置檔案加載的過程中,所有的對象都被建立,這也是為什麼我們每一次啟動tomcat的時候啟動很慢,可啟動成功之後會很快
懶漢式:在對象被使用的時候才會被建立
測試方式原理:在每一個對象被建立的時候,會走無參構造函數
測試方式:
在UserService.java中加入無參構造函數
public UserService(){
System.out.println("UserSerivce被建立");
}
在Application.java中加入代碼
System.out.println("配置檔案啟動成功");
UserService userService1 = annotationConfigApplicationContext.getBean("userService", UserService.class);
運作結果:
這也證明了我們的對象預設情況下是餓漢式加載,那麼我們想要對象進行的是懶漢式加載怎麼配置?
很簡單,隻需要在對象上加上注解@Lazy(value = true)即可