天天看點

5.0 spring常識IoC+DI!

Spring是于2003 年興起的一個輕量級的Java 開發架構 ,别想的太複雜!

特點:分層架構 ,一站式, 開源

Spring的核心是控制反轉(IoC)和面向切面(AOP)

高内聚低耦合,友善解耦,簡化開發

Spring就是一個大工廠(容器),可以将所有對象建立IOC和依賴關系維護DI,交給Spring管理

AOP程式設計的支援

Spring提供面向切面程式設計,可以友善的實作對程式進行權限攔截、運作監控等功能,目标類方法執行前後整體執行切面類方法

聲明式事務的支援

隻需要通過配置就可以完成對事務的管理,而無需手動程式設計

@Transactional 在方法上 表明該方法需要事務支援,該注解于org.springframework.transaction.annotation中

@EnableTransactionManagement在配置類上 開啟 聲明式事務 的支援 該注解會 自動掃描 注解@Transactional 的方法、類

友善程式的測試

Spring對Junit4支援,可以通過注解友善的測試Spring程式

友善內建各種優秀架構

Spring不排斥各種優秀的開源架構,其内部提供了對各種優秀架構(如:Struts、Hibernate、MyBatis、Quartz等)的直接支援

降低JavaEE API的使用難度

Spring 對JavaEE開發中非常難用的一些API(JDBC、JavaMail、遠端調用等),都提供了封裝,使這些API應用難度大大降低

IoC 控制反轉(Inverse of Control)

4 + 1 : 4個核心(beans、core、context、expression) + 1個依賴(commons-loggins…jar)

spring-beans-xxx.jar 管理bean

spring-core-xxx.jar 核心

spring-context-xxx.jar 上下文(配置檔案)

spring-expression-xxx.jar SpEL表達式

對于普通類或這接口的實作類如 UserServiceImpl,我們要建立一個對象:

之前開發中,直接new一個對象即可

private UserService uerService = new UserServiceImpl();

現在隻要在applicationContext.xml或這beans.xml中配置 bean id class

applicationContext.xml是自定義的spring标準上下文配置檔案,名字其實可以亂起,如果配置檔案過大,可以分成多個,如beans.xml等等這個那個的

<bean id="userServiceId" class="com.itheima.a_ioc.UserServiceImpl"></bean>

然後在你想擷取的地方

//1 獲得容器

String xmlPath = "com/itheima/a_ioc/beans.xml";

ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath); //2獲得内容 --不需要自己new,都是從spring容器獲得 UserService userService = (UserService) applicationContext.getBean("userServiceId");

userService.addUser();

DI 依賴注入(Dependence Injection)

建立BookService接口和實作類

建立BookDao接口和實作類

比如我們在web層(controller)調用業務層service,或者在service層掉邏輯層dao

IOC/DI(控制反轉/依賴注入) :把dao依賴注入到service層,service層反轉給action層,Spring頂層容器為BeanFactory。

class BookServiceImpl{

//之前開發:接口 = 實作類 (service和dao耦合)

//private BookDao bookDao = new BookDaoImpl();

//spring模式 (解耦:service實作類使用dao接口,不知道具體的實作類)

private BookDao bookDao;

public void setBookDao(BookDao bookDao) {//

this.bookDao = bookDao;

}

模拟spring執行内部原理

建立service執行個體:BookService bookService =new BookServiceImpl() -->IoC <bean>

建立dao執行個體:BookDao bookDao = new BookDaoImple() -->IoC

将dao設定給service:bookService.setBookDao(bookDao); -->DI <property>

将dao和service配置 xml檔案 bean内部property ref下一個bean

<!-- 建立service -->

<bean id="bookServiceId" class="com.itheima.b_di.BookServiceImpl">

<property name="bookDao" ref="bookDaoId"></property>

</bean>

<!-- 建立dao執行個體 -->

<bean id="bookDaoId" class="com.itheima.b_di.BookDaoImpl">

依賴注入裝配Bean 有兩種模式,xml模式和注解模式,二者獨立,前者透露spirng本質,後者簡化開發

xml裝配bean

構造方法裝配

<bean id="userId" class="com.itheima.f_xml.a_constructor.User" > <constructor-arg index="0" type="java.lang.String" value="1"></constructor-arg> <constructor-arg index="1" type="java.lang.Integer" value="2"></constructor-arg>

setter方法裝配類屬性

<bean id="personId" class="com.itheima.f_xml.b_setter.Person"> <property name="pname" value="陽志"></property> <property name="age"> <value>1234</value> </property>

<property name="homeAddr" ref="homeAddrId"></property>

<bean id="homeAddrId" class="com.itheima.f_xml.b_setter.Address"> <property name="addr" value="阜南"></property> <property name="tel" value="911"></property> </bean>

這是簡單資料類型,也可以裝入引用類型,例如内部引入另一個類,見springTest代碼 還是使用property ref下一個帶有property屬性的bean

集合的注入都是給<property>添加子标簽

數組:<array>

List:<list>

Set:<set>

Map:<map> ,map存放k/v 鍵值對,使用<entry>描述

Properties:<props> <prop key=""></prop>

<bean id="collDataId" class="com.itheima.f_xml.e_coll.CollData" > <property name="arrayData"> <array> <value>DS</value> <value>DZD</value> <value>屌絲</value> <value>屌中屌</value> </array> </property>

注解裝配bean 注解:就是一個類,使用@注解名稱

使用注解 取代 xml配置檔案

注解使用前提,添加命名空間,讓spring掃描含有注解類

<!-- 元件掃描,掃描含有注解的類 --> <context:component-scan base-package="com.itheima.g_annotation.a_ioc"></context:component-scan> </beans>

1.@Component取代<bean class="">

@Component("id") 取代 <bean id="" class="">

2.web開發,提供3個@Component注解衍生注解(功能一樣)取代

@Repository :dao層

@Service:service層

@Controller:web層

依賴注入,給私有字段設值,也可以給setter方法設值

普通值:@Value(" ")

引用值:

方式1:按照【類型】注入

@Autowired

方式2:按照【名稱】注入1

@Qualifier("名稱")

方式3:按照【名稱】注入2

@Resource("名稱")

4.生命周期

初始化:@PostConstruct

銷毀:@PreDestroy

5.作用域

@Scope("prototype") 多例