有實力營銷型網(wǎng)站建設湖北seo關鍵詞排名優(yōu)化軟件
文章目錄
- spring概述
- Spring定義
- Spring核心
- Spring Framework的特點
- 基于注解管理bean
- 依賴
- 開啟組件掃描
- 使用注解定義Bean
- 案例:
- @Autowired注入
- 屬性注入
- set注入
- 形參上注入
- 只有一個構造函數(shù),無注解
- @Autowire注解和@Qualifier注解聯(lián)合
- @Resource注入
- Spring全注解開發(fā)
spring概述
Spring定義
- Spring是一款主流的Java EE 輕量級開源框架,目的是用于簡化Java企業(yè)級引用的開發(fā)難度和開發(fā)周期。從簡單性、可測試性和松耦合度的角度而言,任何Java應用都可以從Spring中受益。Spring框架提供自己提供功能外,還提供整合其他技術和框架的能力。
- Spring自誕生以來備受青睞,一直被廣大開發(fā)人員作為Java企業(yè)級應用程序開發(fā)的首選。時至今日,Spring儼然成為了Java EE的代名詞,成為了構建Java EE 應用的事實標準。
- 自2004年4月,Spring1.0 版正式發(fā)布以來,Spring已經(jīng)步入到了第6個大版本,即 Spring6,本課程采用Spring5.3.24正式版本。Spring6版本支持JDK17
Spring核心
Spring指的是Spring Framework,通常我們稱之為Spring框架。Spring框架是一個分層的面向切面的Java應用程序的一站式解決框架,它是Spring技術棧的核心和基礎,是為了解決企業(yè)級引用開發(fā)的復雜性而創(chuàng)建的。
- Spring有兩個核心模塊:IoC和AOP。
- Ioc:Inverse of Control的簡寫,為 控制反轉,指把創(chuàng)建對象交給Spring進行管理。
- OP:Aspect Oriented Programming 的簡寫,為 面向對象編程。AOP用來封裝多個類的公共行為,將那些與業(yè)務無關,卻為業(yè)務模塊共同調(diào)用的邏輯封裝起來,減少系統(tǒng)的重復代碼,降低模塊間的耦合度。另外,AOP還解決一些系統(tǒng)層面上的問題,比如日志、事務、權限等。
Spring Framework的特點
- 控制反轉:IoC,反轉資源獲取方向;把自己創(chuàng)建的資源、向環(huán)境索取資源變?yōu)榄h(huán)境將資源準備好,我們享受資源注入。
- 面向切面編程:AOP,在不修改源代碼的基礎上增強代碼功能。
- 容器:Spring IoC是一個容器,因為它包含并管理組件對象的生命周期;組件享受到了容器化的管理,替程序員屏蔽了組件創(chuàng)建過程中的大量細節(jié),極大降低了使用門檻,大幅度提高了開發(fā)效率。
- 一站式:在IOC和AOP的基礎上可以整合各種企業(yè)應用的開源框架和優(yōu)秀的第三方庫,而且在Spring旗下的項目已經(jīng)覆蓋了廣泛領域,很多方面的功能性需求可以在Spring Framework 的基礎上全部使用Spring來實現(xiàn)。
基于注解管理bean
- 從Java5開始,Java增加了對注解(Annotation)的支持,它是代碼中的一種特殊標記,可以在編譯、類加載和運行時被讀取,執(zhí)行相應的處理。開發(fā)人員可以通過注解在不改變原有代碼和邏輯的情況下,在源代碼中嵌入補充信息。
- Spring從2.5版本開始提供了對注解技術的全面支持,我們可以使用注解來實現(xiàn)自動裝配,簡化Spring的xml配置。
- Spring通過注解實現(xiàn)自動裝配:
- 引入依賴
- 開啟組件掃描
- 使用注解定義Bean
- 依賴注入
依賴
<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.24</version></dependency>
</dependencies>
開啟組件掃描
- Spring默認不使用注解裝配Bean,因此需要在Spring的xml配置中,通過context:component-scan元素開啟Spring Beans的自動掃描功能。開啟此功能后,Spring會自動從掃描指定的包(base-package屬性設置)及其子包下的所有類,如果類上使用了@Component注解,就將該類裝配到容器中。
- resources目錄下創(chuàng)建spring配置文件 bean.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:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!-- 2.開啟組件掃描,讓spring可以通過注解方式實現(xiàn)bean管理,包括創(chuàng)建對象、屬性注入 --><!-- base-package:掃描哪個包中的注解,在com.text的包或者子包中建了類,在類上、屬性上、方法上加了spring的@Component注解,這里就能掃描到--><context:component-scan base-package="com.text.spring"></context:component-scan>
</beans>
使用注解定義Bean
Spring提供了以下多個注解,這些注解可以直接標注在java類上,將它們定義成Spring Bean。
注解 | 說明 |
---|---|
@Component | 該注解用于描述Spring中的Bean,它是一個泛化的概念,僅僅標識容器中的一個組件(Bean),并且可以作用在任何層次,例如Service層、Dao層等,使用時只需將該注解標注在相應的類上即可。 |
@Respository | 注解用于數(shù)據(jù)訪問層(Dao層)的類標識為Spring中的Bean,功能與@Component相同。 |
@Service | 該注解通常作用在業(yè)務層(Service層),用于將業(yè)務層的類標識為Spring中的Bean,其功能與@Component相同。 |
@Controller | 該注解通常作用在控制層(如SpringMVC的Controller),用于將控制層的類標識為Spring中的Bean,其功能與@Component相同。 |
案例:
// value可以不寫,默認為類名首字母小寫
//@Component(value = "user") // <bean id="user" class="xxx">
//@Repository
//@Service
@Controller
public class User {}
- 測試
public class TestUser {@Testpublic void testUser(){ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");User user = context.getBean("user", User.class);System.out.println("user = " + user);}
}
@Autowired注入
- 單獨使用@Autowired注解,默認根據(jù)類型裝配(byType)
- @Autowired注解有一個required屬性,默認值是true,表示在注入的時候要求被注入的Bean必須存在,如果不存在則報錯。如果required屬性設置為false,表示注入的Bean存在或者不存在都沒關系,存在就注入,不存在也不報錯。
屬性注入
- 控制器層controller.UserController
public class UserController {private UserService userService;public void addController(){System.out.println("controller is running...");userService.addService();}
}
- 服務層service.UserService接口
public interface UserService {public void addService();
}
- 服務層service.UserServiceImpl接口的實現(xiàn)類
public class UserServiceImpl implements UserService {@Overridepublic void addService() {System.out.println("service is running...");}
}
- 在UserController和UserSerivceImpl中添加@Controller注解和@Service注解
- 在UserController中注入UserServiceImpl
@Controller
public class UserController {// 注入service// 第一種方式:屬性注入@Autowired // 根據(jù)類型找到對象,完成注入private UserService userService;
}
- 測試類測試autowired.TestUserController
public class TestUserController {@Testpublic void testUserController(){ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");UserController controller = context.getBean(UserController.class);controller.addController();}
}
set注入
- 修改UserController類
// 第三種方式:構造方法注入
private UserService userService;@Autowired
public UserController(UserService userService) {this.userService = userService;
}
形參上注入
- 修改UserController類
// 第四種方式:形參注入
private UserService userService;public UserController(@Autowired UserService userService) {this.userService = userService;
}
只有一個構造函數(shù),無注解
- 修改UserController類
// 第五種方式:只有一個有參數(shù)構造函數(shù),無注解
private UserService userService;public UserController(UserService userService) {this.userService = userService;
}
@Autowire注解和@Qualifier注解聯(lián)合
- 再創(chuàng)建一個UserService接口的實現(xiàn)類service.UserServiceImpl2
@Service
public class UserServiceImpl2 implements UserService{@Overridepublic void addService() {System.out.println("service2 is running...");}
}
-
測試發(fā)現(xiàn)報錯
因為UserService有兩個實現(xiàn)類,而@Autowired注解根據(jù)byType定位,所以找到了兩個實現(xiàn)類
-
解決:修改UserController (使用兩個注解)
// 1.第六種方式:根據(jù)類型和名稱一起注入
@Autowired
@Qualifier(value = "userServiceImpl2") // 類名首字母小寫
private UserService userService;// 2.將構造函數(shù)注釋
@Resource注入
@Resource注解也可以完成屬性注入。它和@Autowired注解的區(qū)別如下
- @Resource注解是JDK擴展包中的,也就是說屬于JDK的一部分。所以該解釋是標準注解,更加具有通用性,而@Autowired注解是Spring框架自己的。
- @Resource注解默認根據(jù)名稱裝配byName,未指定name時,使用屬性名作為name,通過name找不到的話會自動啟動通過類型byType裝配。而@Autowired注解默認根據(jù)類型裝配byType,如果想根據(jù)名稱匹配,需要配合@Qualifier注解一起使用。
- @Resource注解用在屬性上、setter方法上
- @Autowired注解用在屬性上、setter方法上、構造方法上、構造方法參數(shù)上。
案例 - 工程下創(chuàng)建包 resource,和之前一樣,創(chuàng)建controller和service兩個包,并創(chuàng)建UserController類和UserService接口以及該接口的實現(xiàn)類UserServiceImpl
- 修改UserController
@Controller("myUserController")
public class UserController {// 根據(jù)名稱進行注入@Resource(name="myUserService")private UserService userService;public void add(){System.out.println("controller...");userService.add();}
}
- 修改ServiceControllerImpl1
@Service("myUserService")
public class UserServiceImpl implements UserService {
- 指定@Resource中的name,則根據(jù)名稱裝配
- 未指定name時,則根據(jù)屬性名裝配
- 未指定name,屬性名也不一致,則根據(jù)類型裝配
Spring全注解開發(fā)
全注解開發(fā)就是不再使用spring配置文件了,寫一個配置類來代替配置文件。
- 工程下創(chuàng)建包:config,創(chuàng)建類SpringConfig
// 配置類
@Configuration
// 開啟組件掃描
@ComponentScan("cn.tedu.spring")
public class SpringConfig {
}
- 在resource下創(chuàng)建測試類進行測試
public class TestUserControllerAnno {public static void main(String[] args) {// 加載配置類ApplicationContext context =new AnnotationConfigApplicationContext(SpringConfig.class);UserController controller = context.getBean(UserController.class);controller.add();}
}