一:Spring简介
- Spring技术是JavaEE开发必备技能,企业开发技术选型命中率>90%
- 学习spring是为了什么:
- 简化开发,降低企业级开发的复杂性
- 框架整合,高效整合其他技术,提高企业级应用开发与运行效率
- 官网:Spring | Home
二: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的相关知识。