什么是Spring?
它可以简化开发.整合其他的框架.
最直观的,可以减少代码之间的耦合,帮你创建对象
顺便解释一下Bean是什么,Bean就是被Spring管理的组件,或者说是类.
IOC(Inversion of Control)控制反转
IOC是一种思想
由主动new产生对象转换为由==外部==提供对象,此过程中对象创建控制权由程序转移到外部,此思想称为控制反转。
Spring实现了这种思想
简而言之就是以前我们是自己创建对象来使用对象,现在由Spring来创建对象.然后我们通过接口来接收这个对象使用它的方法
目标:
可以减少耦合度,
可以使用IOC容器管理Bean
使用对象时可以通过绑定依赖来得到已绑定Bean中所有的对象
DI 依赖注入( dependency injection ,DI)
通过XML配置文件来告诉Spring,帮我创建实现类的对象,并且告诉Spring我这些在实现类中调用的对象或者简单类型(基本数据类型和String类型)对应着哪个类.
本例是用的setter注入,往下会讲两种注入方式
//被管理的BookDao接口
public interface BookDao {
public void save();
}
//被管理的BookDao实现类
public class BookDaoImpl implements BookDao {
public void save() {
System.out.println("book dao save ...");
}
}
//被管理的BookService接口
public interface BookService {
public void save();
}
//被管理的BookService的实现类
public class BookServiceImpl implements BookService {
//Spring也顺便通过依赖创建了BookDao对象
private BookDao bookDao ;
//提供依赖对象对应的setter方法
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
public void save() {
System.out.println("book service save ...");
bookDao.save();
}
}
XML文件配置
<bean id="bookDao" class="全类名"/>
<bean id="bookService" class="全类名">
<!--
name指的是BookServiceImpl中的成员变量位置的属性,实际上对应
public void setBookDao(BookDao bookDao);
方法set之后的字符串BookDao
-->
<!-- ref指的是xml配置文件中的bean的id名字-->
<property name="bookDao" ref="bookDao"/>
</bean>
Bean的实例化
介绍几种实例化的方法
无参构造方法 (重点且常用):
上面用的就是无参构造方法(自动生成的).无参构造方法不存则会报错!知道即可
静态工厂:
创建静态工厂之后
<!-- 还可以通过静态工厂获得对象-->
<!-- 了解................................-->
<bean id="bookDaoImpl" class="工厂全类名" factory-method="工厂的方法"/>
实例工厂:
先创建一个工厂后,让Spring帮忙实例化
<!--使用实例工厂实例化bean-->
<bean id="userFactory" class="工厂全类名"/>
<bean id="userDao" factory-method="getUserDao" factory-bean="userFactory"/>
实现FactoryBean<T>接口:
//FactoryBean创建对象
public class UserDaoFactoryBean implements FactoryBean<UserDao> {
//代替原始实例工厂中创建对象的方法
public UserDao getObject() throws Exception {
return new UserDaoImpl();
}
public Class<?> getObjectType() {
return UserDao.class;
}
}
//还有一个方式没有实现,此方法是标识是否单例模式,默认是单例
//对应的xml文件中的配置
<bean id="userDao" class="com.itheima.factory.UserDaoFactoryBean"/>
DI依赖注入的几种方式
setter注入
引用类型
参考上面的setter注入代码
在成员变量位置提供对应的接口(目的是解耦合)而不是实现类(具体要用哪个实现类在xml中声明).
在xml文件中用<property>标签声明依赖...关系是:A类需要使用B类的对象,则在A类对应的<Bean></Bean>标签中声明对应的依赖
若是简单类型(基本数据类型或者是String类)
则这样声明
Bean中成员变量位置
private int connetionNum;
private String database;
假设声明了数据库最大连接数
<property name="connetionNum" value="5"></property>
假设声明了链接的数据库名
<property name="database" value="redis"></property>
构造器注入
在要使用对象的实现类中提供对应的set方法...
public void 构造方法(XXXDao xxx) {
this.xxxDao= xxx;
}
对应的Bean中
<constructor-arg name="对应参数名" ref="对应xml文件中其他Bean的ID" ></constructor-arg>
简单类型把 ref改为 value=" " 即可,""中的数据类型会自动转换