一、什么是Spring
Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由 RodJohnson 在其著作 Expert One-On-One J2EE Development and Design 中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。Spring 使用基本的 JavaBean 来完成以前只可能由 EJB 完成的事情。然而,Spring 的用途不仅限于服务器端的开发,去开发android也可以。从简单性、可测试性和松耦合的角度而言,任何 Java 应用都可以从 Spring 中受益。Spring 的核心是控制反转 (IoC)和面向切面(AOP)。简单来说,Spring 是一个分层的 JavaSE/EEfull-stack(一站式) 轻量级 开源框架。
二、Spring的配置
1,ApplicationContext.xml中bean元素相关配置各个标签的作用
bean元素:使用该元素描述spring容器管理的对象
name属性:给被管理的对象起个名字,获得对象是根据名称获得对象
class属性:被管理对象的完整类名
ID属性:与name属性一模一样,关于ID的话,名称不可重复,不能使用特殊字符;name属性名称则可以重复,可以使用特殊字符。结论:尽量使用name属性。
1.1 Bean元素的进阶,scope属性(重点是singleton和prototype):
一般情况下是使用singleton,但是要整合struts2时则要在ActionBean中使用prototype。而request和session属性基本上是用不到的。
singleton(默认值):单例对象,所谓单例对象,就是在spring容器中只会存在一个的实例
prototype属性:多例原型被标记为多例的对象,每次再获得才会创建并且每次创建都是新的对象
![](https://img2018.cnblogs.com/blog/1495807/201905/1495807-20190514200833725-62471522.png)
request: web环境下,对象与request生命周期一致,也就是每当请求处理完一次,对象将从spring容器中移除
session:web环境下,对象与session生命周期一致
1.2 Bean元素的进阶,生命周期属性(了解)
生命周期属性,配置一个方法作为生命周期初始化方法,spring会在对象创建之后立即调用(init-method)。也可以配置一个对象作为销毁方法,spring在关闭并销毁所有容器中的对象之前调用(destory-method)
2,三种对象创建方式
创建方式一:空参构造创建(重点)
配置文件
![](https://img2018.cnblogs.com/blog/1495807/201905/1495807-20190514201054028-1185411823.png)
然后只需在demo.java中编写测试类
![](https://img2018.cnblogs.com/blog/1495807/201905/1495807-20190514201123681-1599247260.png)
创建方式二:静态工厂创建(了解)
配置:
调用UserFactory的createUser方法创建名为user2的对象.放入容器
<bean name="user2"
class="cn.itcast.b_create.UserFactory"
factory-method="createUser" ></bean>
userFactory.Java工厂如下:
![](https://img2018.cnblogs.com/blog/1495807/201905/1495807-20190514201211231-1918917560.png)
最后编写测试类
![](https://img2018.cnblogs.com/blog/1495807/201905/1495807-20190514201246759-1446031029.png)
三、Spring的使用
3.1目标类
- 创建BookService接口和实现类
- 创建BookDao接口和实现类
- 将dao和service配置 xml文件
- 使用api测试
3.2 dao
public interface BookDao {
public void save();
}
public class BookDaoImpl implements BookDao {
@Override
public void save() {
System.out.println("di add book");
}
}
3.3 service
public interface BookService {
public abstract void addBook();
}
public class BookServiceImpl implements BookService {
// 方式1:之前,接口=实现类
// private BookDao bookDao = new BookDaoImpl();
// 方式2:接口 + setter
private BookDao bookDao;
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
@Override
public void addBook(){
this.bookDao.save();
}
}
3.4 配置文件
<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">
<!--
模拟spring执行过程
创建service实例:BookService bookService = new BookServiceImpl() IoC <bean>
创建dao实例:BookDao bookDao = new BookDaoImpl() IoC
将dao设置给service:bookService.setBookDao(bookDao); DI <property>
<property> 用于进行属性注入
name: bean的属性名,通过setter方法获得
setBookDao ##> BookDao ##> bookDao
ref :另一个bean的id值的引用
-->
<!-- 创建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>
</beans>
3.5 测试
@Test
public void demo01(){
//从spring容器获得
String xmlPath = "com/itheima/b_di/beans.xml";
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
BookService bookService = (BookService) applicationContext.getBean("bookServiceId");
bookService.addBook();
}