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") 多例