目录
1.IOC(Inversion of Control )控制反转
2.DI(Dependency Injection ) 依赖注入
一:Spring简介
Spring技术是JavaEE开发必备技能,企业开发技术选型命中率>90%
- 学习spring是为了什么:
简化开发,降低企业级开发的复杂性
框架整合,高效整合其他技术,提高企业级应用开发与运行效率
二:Spring体系框架图
其中,SpringFramework是学习spring框架的基础,因此,SpringFramework的体系框架图如下:
三:Spring核心概念
1.IOC(Inversion of Control )控制反转
使用对象时,由主动new产生对象转换为由外部提供对象,此过程中对象创建控制权由程序转移到外部,此思想称为控制反转。通俗的讲就是“将new对象的权利交给Spring,我们从Spring中获取对象使用即可”
Spring提供了一个容器,称为IOC容器,用来充当IoC思想中的“外部”
IOC容器负责对象的创建、初始化等一系列工作,被创建或被管理的对象在IoC容器中统称为Bean
2.DI(Dependency Injection ) 依赖注入
在容器中建立bean与bean之间的依赖关系的整个过程,称为依赖注入
四:spring的简单实现
1.创建一个Maven项目
在dao层创建一个BookDao的接口
package com.lcyy.dao;
public interface BookDao {
void save();
}
2.创建一个pojo包,在pojo包下写实现类
package com.lcyy.pojo;
import com.lcyy.dao.BookDao;
public class BookDaoimpl implements BookDao {
@Override
public void save() {
System.out.println("这是我的第一个spring案例语句");
}
}
3.在Maven中配置spring
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.31</version>
</dependency>
4.在resource下配置bean的实例
在resource中建立spring的核心配置文件springContext.xml
<?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 id="bookdao" class="com.lcyy.pojo.BookDaoimpl"></bean>
注意:
bean标签:表示配置bean
id属性:表示给bean起名字
class属性:表示给bean定义类型
5.建立主类App,供测试使用
import com.lcyy.dao.BookDao;
import com.lcyy.dao.BookService;
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("springContext.xml");
//获取资源BookDao中的
BookDao bookdao = (BookDao) ctx.getBean("bookdao");
bookdao.save();
}
}
6.运行结果
可以看出,我们没有new去创建对象,而是去获取ioc容器,交给ioc容器去创建对象,再通过容器去获取对象。
五:Bean
1.bean的基础配置
2.bean的别名配置
注意:别名配置name属性可以有多个,用空格,分号,逗号隔开
3.bean的作用域
scope的取值不仅仅只有singleton和prototype,还有request、session、application、 websocket ,表示创建出的对象放置在web容器(tomcat)对应的位置。比如:request表示保存到request域中 。
在我们的实际开发当中,绝大部分的Bean是单例的,也就是说绝大部分Bean不需要配置scope属性。
4.bean的实例化
有三种方法可以实例化bean
1.通过构造器实例化bean
在第四步的spring的简单实现中,我们就是通过无参构造器实例化了bean
2.静态工厂实例化bean
<1>首先我们建立一个Factory的包,在包下建立一个类
<2>在类中书写以下代码
package com.lcyy.Factory;
import com.lcyy.dao.BookDao;
import com.lcyy.pojo.BookDaoimpl;
/**
* TODO:静态工厂实例化Bean
*/
public class StaticBookFactory {
public static BookDao getBookDao(){
System.out.println("静态工厂创建对象");
return new BookDaoimpl();
}
}
<3>在springContext.xml配置bean
<!--静态工厂-->
<bean id="bookDao" class="com.lcyy.Factory.StaticBookFactory" factory-method="getBookDao"></bean>
3.实例工厂实例化bean
<1>在Factory包下创建BookdDaoFactory
package com.lcyy.Factory;
import com.lcyy.dao.BookDao;
import com.lcyy.pojo.BookDaoimpl;
/**
* TODO:实例化工厂
*/
public class BookDaoFactory {
public BookDao getBookDao(){
System.out.println("实例化工厂创建对象");
return new BookDaoimpl();
}
}
<2> 在springContext.xml配置bean
<!--实例工厂实现-->
<bean id="bookDao" class="com.lcyy.Factory.BookDaoFactory"></bean>
<bean id="userdao" factory-method="getBookDao" factory-bean="bookDao"></bean>
4.bean的生命周期
<1>:生命周期:从创建到消亡的整个过程
<2>:代码演示
提供生命周期的控制方法
public class BookDaoImpl implements BookDao {
public void save() {
System.out.println("book dao save ...");
}
//表示bean初始化对应的操作
public void init(){
System.out.println("init...");
}
//表示bean销毁前对应的操作
public void destory(){
System.out.println("destory...");
}
}
配置springcontext.xml
<!--init-method:设置bean初始化生命周期回调函数,此处填写init方法名-->
<!--destroy-method:设置bean销毁生命周期回调函数,仅适用于单例对象,此处填写destory方法名-->
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl" init-method="init" destroy-method="destory"/>
测试类
public class AppForLifeCycle {
public static void main( String[] args ) {
//此处需要使用实现类类型,接口类型没有close方法
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("springContext.xml");
BookDao bookDao = (BookDao) ctx.getBean("bookDao");
bookDao.save();
//关闭容器,执行销毁的方法
ctx.close();
}
}
注意:此时要手动关闭资源
六:依赖注入的两种方法
1.setter方法注入
<1>在dao层下创建一个BookService接口
package com.lcyy.dao;
public interface BookService {
void save();
}
<2>在pojo包下创建一个实现类
package com.lcyy.pojo;
import com.lcyy.dao.BookDao;
import com.lcyy.dao.BookService;
public class BookServiceimpl implements BookService {
private BookDao bookDao;
@Override
public void save() {
this.bookDao.save();
System.out.println("这是使用set注入的方式");
}
}
<3> 在springContext.xml配置bean
<bean id="bookdao" class="com.lcyy.pojo.BookDaoimpl"></bean>
<!-- setter方法注入 -->
<bean id="bookservice" class="com.lcyy.pojo.BookServiceimpl">
<property name="bookDao" ref="bookdao"/>
</bean>
注意:<property>中的ref 属性对应的是id="bookdao"的实现类
2.构造方法注入
<1>在pojo包下创建一个实现类
package com.lcyy.pojo;
import com.lcyy.dao.BookDao;
import com.lcyy.dao.BookService;
public class BookServiceimpl implements BookService {
private BookDao bookDao;
public void setBookDao(BookDao bookDao){
System.out.println("这是构造方法注入的方式");
this.bookDao = bookDao;
}
}
<2>在springContext.xml配置bean
<bean id="bookdao" class="com.lcyy.pojo.BookDaoimpl"></bean>
<!-- 构造方法注入-->
<bean id="bookservice" class="com.lcyy.pojo.BookServiceimpl">
<constructor-arg value="bookDao"/>
</bean>
注意: constructor-arg标签下的value对用的是BookServiceimpl类中setBookdDao中的参数
七:集合注入
1.数组类型注入
<property name="array">
<array>
<value>100</value>
<value>200</value>
<value>300</value>
</array>
</property>
2.list集合注入
<property name="list">
<list>
<value>itcast</value>
<value>itheima</value>
<value>boxuegu</value>
<value>chuanzhihui</value>
</list>
</property>
3.set集合注入
<property name="set">
<set>
<value>itcast</value>
<value>itheima</value>
<value>boxuegu</value>
<value>boxuegu</value>
</set>
</property>
4.map集合注入
<property name="map">
<map>
<entry key="country" value="china"/>
<entry key="province" value="henan"/>
<entry key="city" value="kaifeng"/>
</map>
</property>
5.properties数据注入
<property name="properties">
<props>
<prop key="country">china</prop>
<prop key="province">henan</prop>
<prop key="city">kaifeng</prop>
</props>
</property>
注意:property标签表示setter方式注入,构造方式注入constructor-arg标签内部也可以写<array>、<list>、<set>、<map>、<props>标签
八:自动装配
依赖自动装配,使用属性autowire
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
<bean id="bookService" class="com.itheima.service.impl.BookServiceImpl" autowire="byType"/>
注意:
自动装配用于引用类型依赖注入,不能对简单类型进行操作
使用按类型装配时(byType)必须保障容器中相同类型的bean唯一,推荐使用
使用按名称装配时(byName)必须保障容器中具有指定名称的bean,因变量名与配置耦合,不推荐使用
自动装配优先级低于setter注入与构造器注入,同时出现时自动装配配置失效
九:总结
以上是学习spring的一些基本概念和使用方法,希望对读者能有所帮助,下期我将继续更新有关spring的相关知识。