spring入门
Spring 简介
什么是 spring :
1、Spring是一个轻量级的DI/IoC和AOP容器的开源框架,来源于Rod Johnson 在其著作《Expert one on one J2EE design and development》中阐述的部分理念和原型衍生而来。
2、Spring提倡以”最少侵入”的方式来管理应用中的代码,这意味着我们可以随时安装或卸载Spring。
使用范围:
任何Java应用 Spring根本使命:简化Java开发 简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架,致力于构建轻量级的JavaEE应用
Spring中常见术语:
1、应用程序(application):是能完成我们所需要功能的成品,比如购物网站、OA系统。
2、框架:是能完成一定功能的半成品,比如我们可以使用框架进行购物网站开发;框架做一部分功能,我们自己做一部分功能,这样应用程序就创建出来了。而且框架规定了你在开发应用程序时的整体架构,提供了一些基础功能,还规定了类和对象的如何创建、如何协作等,从而简化我们开发,让我们专注于业务逻辑开发。
3、非侵入式设计:从框架角度可以这样理解,无需继承框架提供的类,这种设计就可以看作是非侵入式设计,如果继承了这些框架类,就是侵入设计,如果以后想更换框架之前写过的代码几乎无法重用,如果非侵入式设计则之前写过的代码仍然可以继续使用。
4、轻量级及重量级:轻量级是相对于重量级而言的,轻量级一般就是非入侵性的、所依赖的东西非常少、资源占用非常少、部署简单等等,其实就是比较容易使用,而重量级正好相反。
5、POJO:POJO(Plain Old Java Objects)简单的Java对象,它可以包含业务逻辑或持久化逻辑,但不担当任何特殊角色且不继承或不实现任何其它Java框架的类或接口。
6、容器:在日常生活中容器就是一种盛放东西的器具,从程序设计角度看就是装对象的的对象,因为存在放入、拿出等操作,所以容器还要管理对象的生命周期。
Spring的优点:
1.低侵入/低耦合(降低组件之间的耦合度,实现软件各层之间的解耦。)
2.声明式事务管理
3.方便集成其他框架
4.降低JavaEE开发难度
5.Spring框架中包括JavaEE 三层(表现层,业务层,持久层)的每一层的解决方案
Ioc和DI介绍
IoC:Inverse of Control(控制反转):
读作“反转控制”,更好理解,不是什么技术,而是一种设计思想,好比于MVC。就是将原本在程序中手动创建对象的控制权,交由Spring框架来管理。
正控:若调用者需要使用某个对象,其自身就得负责该对象的创建。
反控:调用者只管负责从Spring容器中获取需要使用的对象,不关心对象的创建过程,也就是把创建对象的控制权反转给了Spring框架。
----------------------------------------------------------------------------
DI:Dependency Injection(依赖注入)
从字面上分析:
IoC:指将对象的创建权,反转给了Spring容器;
DI :指Spring创建对象的过程中,将对象依赖属性(简单值,集合,对象)通过配置设值给该对象。
IoC和DI其实是同一个概念的不同角度描述,DI相对IoC而言,明确描述了“被注入对象依赖IoC容器配置依赖对象”。
Container:容器,在生活中容器就是一种盛放东西的器皿,从程序设计角度看作是装对象的对象,因为存在对对象的存入、取出等操作,所以容器还要管理对象的生命周期。
spring的基本配置
在Spring配置中,id和name属性都可以定义bean元素的名称,不同的是:
id属性,遵守XML语法ID约束。必须以字母开始,可以使用字母、数字、连字符、下划线、句话、冒号,不能以“/”开头。(ps:一般以对象名称小写作为ID)
name属性,就可以使用很多特殊字符,比如在Spring和Struts1或Spring MVC的整合中,就得使用name属性来的定义bean的名称。(用的比较少)
当然也使用name属性为<bean/>元素起多个别名,多个别名之间使用逗号或空格隔开,在代码中依然使用BeanFactory对象.getBean(...)方法获取。
<bean id="loginUser" name="hi,hi2" class="com.spring.day01.model.LoginUser">
或则
<bean id="loginUser" name="hi hi2" class="com.spring.day01.model.LoginUser">
建议:bean起名尽量规范,不要搞一些非主流的名字,尽量使用id。
在spring中引入其他配置文件:
在实际开发中,随着应用规模的增加,系统中<bean>元素配置的数量也会大量增加,导致applicationContext.xml配置文件变得非常臃肿。
为了避免applicationContext.xml文件过于庞大、臃肿,为提高其可读性,我们可以将一个applicationContext.xml文件分解成多个配置文件,然后在applicationContext.xml文件中包含其他配置文件即可。
使用import元素引入其他的配置文件:
<import resource="classpath:helloWord/helloWord.xml"/>
使用import元素注意:
1、默认情况下,从classpath的跟路径寻找。
2、可以使用前缀来定位文件的基础位置:
①:[classpath:]:后面的文件从classpath路径开始找(推荐);
②:[file:]:后面的文件使用文件系统的路径开(千万别用);
注意:一般的,当框架中实现了Resource接口才能够识别上述的前缀标识符。
使用Spring测试准备:
依赖jar:
Spring4.x需要依赖的单元测试得是最新的junit4.12,
Eclipse自带的junit4.8不支持,同时从Spring4.x开始,还得依赖AOP包的支持。
junit-4.12.jar hamcrest-core-1.3.jar
spring-test-4.1.2.RELEASE.jar
spring-context-4.1.2.RELEASE.jar
spring-aop-4.1.2.RELEASE.jar
spring-expression-4.1.2.RELEASE.jar
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<?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"> <!--把Ticket类交给spring管理--> <bean id="ticket" class="com.day2_spring.model.Ticket"> <property name="startStation" value="成都东"/> <!-- collaborators and configuration for this bean go here --> </bean> <bean id="product" class="com.day2_spring.model.Product"> <property name="productName" value="飞行堡垒"/> <!-- collaborators and configuration for this bean go here --> </bean> <!-- more bean definitions go here --> </beans>
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package com.day2_spring.testDao; import com.day2_spring.model.Product; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; //启动spring容器,把Junit运行在容器中 @RunWith(SpringJUnit4ClassRunner.class) //加载配置文件"classpath:相对路径" @ContextConfiguration("classpath:spring_config.xml") public class testProduct { //自动配置 @Autowired private BeanFactory beanFactory; @Test public void testP(){ //从spring容器中创建对象 Product product =(Product) beanFactory.getBean( "product" );//用ID取值 Product product1 = beanFactory.getBean( Product.class ); Object product2 = beanFactory.getBean( "product", product ); //使用对象 } }
自动装配,简单的属性注入
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<?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"> <!--把Ticket类交给spring管理--> <bean id="loginUser" class="com.day2_spring.model.LoginUser"> <property name="userName" value="wuji"></property> </bean> <!-- more bean definitions go here --> </beans>
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package com.day2_spring.model; public class LoginUser1 { private Integer id; private String userName; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
构造器参数名装配
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<?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"> <!--把Ticket类交给spring管理--> <bean id="loginUser" class="com.day2_spring.model.LoginUser1"> <property name="userName" value="wuji"></property> </bean> <!-- more bean definitions go here --> </beans>
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package com.day2_spring.model; public class LoginUser2 { private Integer userId; private String userName; public LoginUser2(Integer userId,String userName){ this.userId = userId; this.userName= userName; } }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package com.day2_spring.testDao; import com.day2_spring.model.LoginUser1; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:loginUser_config2.xml") public class testUser2 { @Autowired private BeanFactory beanFactory; @Test public void testLoginUser(){ LoginUser1 loginUser = (LoginUser1)beanFactory.getBean( "loginUser" ); String userName = loginUser.getUserName(); System.out.println(userName); } }
构造器参数值装配
复合型类属性注入
//先注入子属性,再使用ref引用