Spring学习阶段性总结
Spring的核心功能之一就是反转控制(IOC),也就是把对成员变量赋值的控制权,从程序员写的代码反转到Spring工厂和配置文件中。
我们之所以需要IOC是因为把创建对象(New)的过程放在了XML配置文件里,所以当我们需要换一个实现子类将会变成很简单(项目不需要重新编译);其次,当他人使用代码时不需要关心对象创建的过程,由第三方的Spring工厂直接提供即可。
IOC底层通过工厂模式来实现,最大的好处之一就是解耦合。而在编程的逻辑中,耦合是不可能被消除的,只能通过转移到更上一层,Spring工厂正是把经过层层抽象得出来的一个核心的逻辑放在了xml配置文件中,从而转移了需要编译的代码中的耦合。而放在xml文档中的耦合部分往往是经常需要修改的代码部分,从而也避免了项目需要重新编译的过程;当其他程序员需要修改代码时,直接看xml文档也会更方便。
工厂模式简单来说就是将实例化某一类对象具体分给对应的工厂,而不是在一个工厂里通过依赖具体的参数来创建。工厂模式的本质就是对获取对象过程的抽象。
1、Spring工厂创建的对象也叫bean或组件。
在获取bean的过程中我们主要通过配置文件中bean的唯一标识 ‘id’ 值来getBean,类似如下代码段中的 ‘person1’ 即为唯一标识,name可以理解为小名,作用类似于 ‘id’。
<bean id = "person1" name = "person" class="com.fanss.pojo.Person">
2、我们通过new创建对象时,如需要为对象赋值一般可通过有参构造或者set方法进行赋值。而经过反转控制后,创建对象的权限已经不在我们手中,此时,如果我们需要为对象的成员变量赋值时,我们就需要通过Spring注入来实现。
Spring注入本质上还是通过调用对象的set方法来完成的,所以在使用依赖注入前必须在相应的类中生成对应成员变量的set方法。之后Spring在底层替我们在合适的时机(调用构造方法后)调用对应属性的set方法。
Set注入支持的参数类型大体分为两类,一类是JDK类型的系统成员变量,还有一类时用户自定义类型的成员变量。
JDK类型主要包括:8种基本类型+String类型、数组、Set、List类型、Map类型、Properties类型。
用户自定义类型主要是指,其他对象作为本类的成员变量时,Spring注入也需要相应的定义。
3、对于JDK类型的成员变量,Set注入方法如下所示:
public class Person {
private Integer id;
private String name;
private String[] emails;
private Set<String> tels;
private List<String> address;
private Map<String,String> qqs;
private Properties properties;
生成set方法();
}
下面通过Spring工厂创建对象,并为该对象的属性进行set注入:
<bean id = "person1" name = "person" class="com.fanss.pojo.Person">
<property name="id" value="10"/>
<property name="name" value="fanss"/>
<property name="tels">
<set>
<value>112323</value>
<value>111111</value>
</set>
</property>
<property name="qqs">
<map>
<entry>
<key><value>fan</value></key>
<value>1513333</value>
</entry>
<entry>
<key><value>li</value></key>
<value>9999999</value>
</entry>
</map>
</property>
</bean>
4、对于有用户自定义类型变量属性的对象,创建方法如下:
public class UserServiceImpl implements UserService {
private UserDAO userDAO ;
public UserDAO getUserDAO() {
return userDAO;
}
public void setUserDAO(UserDAO userDAO) {
this.userDAO = userDAO;
}
}
可以看出UserDao作为UserServiceImpl的成员变量,当Spring工厂为我们创建UserServiceImpl对象后,若对userDao进行注入,必须要为userDAO进行配置,其具体的配置方法如下:
<bean id = "userDAO" class="com.fanss.mapper.UserDaoImpl"/>
<bean id="userService" class="com.fanss.Service.UserServiceImpl">
<property name="userDAO" ref="userDAO"/>
<!-- 以下语句可以简化为以上↑-->
<!-- <property name="userDAO">-->
<!-- <ref bean="userDAO"/>-->
<!-- 如果经常使用一个bean就可以提出来,若只是使用一次则直接声明即可-->
<!-- <bean class="com.fanss.mybatis_01.mapper.UserDaoImpl"/>-->
<!-- </property>-->
</bean>
可以看出userDAO也是通过Spring工厂进行实例化的。