学习目标:
- 了解Spring的概念
- 了解IOC
学习内容:
- 掌握IOC的使用
- 创建Bean
- 学习spring知识
学习产出:
1、Spring的概念
Spring
是一个基于控制反转Ioc
和面向切面编程Aop
的轻量级开源框架!
Spring
之所以叫做Spring
,就是它期望给传统臃肿的JavaEE带来一个春天!让我们的开发变得更加简单更加快速。
优点
- 开源免费的轻量级框架
- 低侵入式设计,代码污染极低
- 支持事务的处理,对框架整合的支持
- 以控制反转(IOC),面向切面编程(AOP)为内核
- 方便解耦,简化开发:将对象的创建交给spring 无需new
- 提供了展现层SpringMVC和持久层Spring JDBCTemplate以及业务层事务管理等众多企业级应用技术
- 能整合开源世界众多第三方框架和类库
2、IOC–控制反转
- 使用对象时,由主动new产生对象转换为由外部提供对象,此过程中对象创建控制权由程序转移到外部,此思想称为控制反转,spring技术对IOC思想进行了实现
- spring提供了一个容器–IOC容器,用来充当IOC思想中的“外部”
- IOC容器负责对象的创建,初始化等一系列工作,被创建或被管理的对象在IOC容器中统称为Bean
- DI 依赖注入–在容器中建立bean与bean之间的依赖关系的整个过程
3、IOC使用步骤
1)在pom.xml中导入spring-context坐标
2)在rousources中创建ApplicationContext.XML,并配置bean
依赖引入
1)导入spring坐标
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.11.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.6</version>
</dependency>
2)定义spring管理的类(接口)
package com.it.service.impl;
import com.it.dao.BookDao;
import com.it.dao.impl.BookDaoImpl;
import com.it.service.BookService;
public class BookServiceImpl implements BookService {
private BookDao bookDao=new BookDaoImpl();
public void save(){
System.out.println("bookService save");
bookDao.save();
}
}
package com.it.service;
public interface BookService {
public void save();
}
3)创建spring配置文件,配置对应类作为spring管理的bean
<?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">
<!--bean表示配置bean
id属性表示给bean取名字
class属性表示给bean定义类型-->
<bean id="bookDao" class="com.it.dao.impl.BookDaoImpl"></bean>
<bean id="bookService" class="com.it.service.impl.BookServiceImpl"></bean>
</beans>
4)初始化IOC容器,通过容器来获取bean
package com.it.service;
import com.it.dao.BookDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class App {
public static void main(String[] args) {
//获取IOC容器
ApplicationContext ctx=new ClassPathXmlApplicationContext("ApplicationContext.xml");
//获取bean
BookDao bookDao=(BookDao) ctx.getBean("bookDao");
bookDao.save();
}
}
3、DI入门
1)删除使用new的形式创建的代码,提供对应的setter方法
public class BookServiceImpl implements BookService {
// private BookDao bookDao=new BookDaoImpl();
// 删除业务层中使用new方式创建的dao对象
private BookDao bookDao;
public void save(){
System.out.println("bookService save");
bookDao.save();
}
//提供对应的set方法
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
}
2)配置service与dao之间的关系
<bean id="bookDao" class="com.it.dao.impl.BookDaoImpl"></bean>
<bean id="bookService" class="com.it.service.impl.BookServiceImpl">
<!-- 配置server与dao的关系-->
<!-- property标签表示配置当前bean的属性-->
<!-- name属性表示配置哪一个具体的属性-->
<!-- ref属性表示参照哪一个bean-->
<property name="bookDao" ref="bookDao"/>
</bean>
**注意
<property name="bookDao" ref="bookDao"/>
name=“bookDao”**
ref=“bookDao”
4、bean配置
1)基础配置
<bean id="bookDao" class="com.it.dao.impl.BookDaoImpl"></bean>
2)别名配置
name可以设置多个名称
<bean id="bookDao" name="bookDao1, bookDao2" class="com.it.dao.impl.BookDaoImpl"></bean>
3)作用范围配置
prototype:多例
singleton:单例
<bean id="bookService" class="com.it.service.impl.BookServiceImpl" scope="prototype"/>
5、实例化bean的三种方式
1)构造方法(无参)
无参构造方法如果不存在, 将抛出异常BeanCreationException
public class BookServiceImpl implements BookService {
public BookServiceImpl() {
System.out.println("book service save...");
}
}
2、静态工厂
1)
public class BookDaoImpl implements BookDao {
public static BookDao getBookDao(){
return new BookDaoImpl();
}
}
2)配置
<bean id="bookDao" class="com.it.dao.impl.BookDaoImpl" scope="singleton" factory-method="getBookDao"></bean>
3、使用实例工厂实例化bean
1)
public class BookDaoImpl implements BookDao {
public BookDao getBookDao(){
return new BookDaoImpl();
}}
2)配置
<bean id="bookDao" class="com.it.dao.impl.BookDaoImpl" ></bean>
<bean id="dao" factory-method="getBookDao" factory-bean="bookDao" ></bean>
6、bean的生命周期
- 初始化容器
1、创建对象(内存分配)
2、执行构造方法
3、执行属性注入(set操作)
4、执行bean初始化方法 - 使用bean
1、执行业务操作 - 关闭/、销毁容器
1、执行bean销毁方法
1)配置生命周期控制方法
public class BookDaoImpl implements BookDao {
public void init() {
System.out.println("bookdao init");
}
public void destory() {
System.out.println("bookdao destory");
}
}
<bean id="bookDao" class="com.it.dao.impl.BookDaoImpl" init-method="init" destroy-method="destory"></bean>
2)使用接口控制
public class BookServiceImpl implements BookService , InitializingBean, DisposableBean {
public void save(){
System.out.println("bookService save");
bookDao.save();
}
@Override
public void destroy() throws Exception {
System.out.println("service destory");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("service afterPropertiesSet");
}
}
7、setter注入
1)简单类型
定义可访问的set方法
public class BookDaoImpl implements BookDao {
private Integer num;
private String name;
public void setNum(Integer num) {
this.num = num;
System.out.println(num);
}
public void setName(String name) {
this.name = name;
System.out.println(name);
}
@Override
public void save() {
System.out.println("bookdao save");
}
}
配置
<bean id="bookDao" class="com.it.dao.impl.BookDaoImpl">
<property name="name" value="zs"></property>
<property name="num" value="10"></property>
</bean>
8、构造器注入
1)引用类型
public class BookServiceImpl implements BookService , InitializingBean, DisposableBean {
// private BookDao bookDao=new BookDaoImpl();
// 删除业务层中使用new方式创建的dao对象
private BookDao bookDao;
private UserDao userDao;
public BookServiceImpl(BookDao bookDao, UserDao userDao) {
this.bookDao = bookDao;
this.userDao = userDao;
}
public void save(){
System.out.println("bookService save");
bookDao.save();
userDao.save();
}
}
<!-- 构造器注入-->
<bean id="bookDao" class="com.it.dao.impl.BookDaoImpl"></bean>
<bean id="userDao" class="com.it.dao.impl.UserDaoImpl"></bean>
<bean id="bookService" class="com.it.service.impl.BookServiceImpl">
<constructor-arg name="bookDao" ref="bookDao"></constructor-arg>
<constructor-arg name="userDao" ref="userDao"></constructor-arg>
</bean>
2)简单类型
public class BookDaoImpl implements BookDao {
private Integer num;
private String name;
public BookDaoImpl(Integer num, String name) {
this.num = num;
this.name = name;
}
}
配置
<bean id="bookDao" class="com.it.dao.impl.BookDaoImpl">
<constructor-arg name="name" value="zs"></constructor-arg>
<constructor-arg name="num" value="10"></constructor-arg>
</bean>
9、自动装配
//按名称
<bean id="userDao" name="userDao" class="com.it.dao.impl.UserDaoImpl" autowire="byName"></bean>
//按类型--主要用
<bean id="userDao" class="com.it.dao.impl.UserDaoImpl" autowire="byType"></bean>
10、集合注入
public class UserDaoImpl implements UserDao {
@Override
public void save() {
}
private int[] array;
private List<String> list;
private Set<String> set;
private Map<String,String> map;
private Properties properties;
public void setArray(int[] array) {
this.array = array;
}
public void setList(List<String> list) {
this.list = list;
}
public void setSet(Set<String> set) {
this.set = set;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
public void setProperties(Properties properties) {
this.properties = properties;
}
}
public class App2 {
public static void main(String[] args) {
ApplicationContext ctx=new ClassPathXmlApplicationContext("ApplicationContext2.xml");
UserDao userDao=(UserDao) ctx.getBean("UserDao");
userDao.save();
}
}
<bean id="userDao" class="com.it.dao.impl.UserDaoImpl">
<property name="array">
<array>
<value>100</value>
<value>200</value>
<value>300</value>
</array>
</property>
<property name="list">
<list>
<value>itcast</value>
<value>mashang</value>
<value>chuang</value>
</list>
</property>
<property name="set">
<set>
<value>itcast</value>
<value>mashang</value>
<!-- 重复只保留一个-->
<value>chuang</value>
<value>chuang</value>
</set>
</property>
<property name="map">
<map>
<entry key="country" value="china"></entry>
<entry key="province" value="fujian"></entry>
<entry key="city" value="putian"></entry>
</map>
</property>
<property name="properties">
<props>
<prop key="country">china</prop>
<prop key="province">fujian</prop>
<prop key="city">putian</prop>
</props>
</property>
</bean>
11、加载properties文件
1)开启context命名空间
<?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/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 开启一个全新的命名空间context-->
</beans>
<!-- 使用context加载properties 文件-->
<context:property-placeholder location="classpath*:*.properties" system-properties-mode="NEVER"/>
<!--使用属性占位符${}读取properties文件中的属性-->
<bean class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
//jdbc.properties文件
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/spring_db
jdbc.username=root
jdbc.password=root
12、容器