基础概念
耦合 :程序之间的依赖关系,包括类之间的依赖和方法之间的依赖。
解耦 :降低程序之间的依赖关系。 实际开发中,应该做到编译时不依赖,运行时才依赖。
解耦的思路 :
- 使用反射来创建对象,避免使用new关键字;
- 通过读取配置文件来获取要创建的对象的全类限定名。
IOC(Inversion of Control)
控制反转(IoC, Inversion of Control),是一个概念,是一种思想。把创建对象的权利交给容器,通过容器来实现对象的装配和管理。控制反转就是对对象控制权的转移,从程序代码本身反转到了外部容器。通过容器实现对象的创建,属性赋值,依赖的管理。作用是削减计算机的耦合,解除代码中的依赖关系。不用new的方式去创建对象了。
IOC创建对象的方式
- 无参构造,默认就是无参构造的。
<bean id="user" class="com.zmqcode.User.User">
<property name="name" value="zmq"/>
</bean>
- 有参构造
<!--1、下标赋值-->
<bean id="user" class="com.zmqcode.User.User">
<constructor-arg index="0" value="zmq"/>
</bean>
<!--2、通过类型创建-->
<bean id="user" class="com.zmqcode.User.User">
<!--基本类型可以直接type="int",引用类型必须全限定类名-->
<constructor-arg type="java.lang.String" value="zmq"/>
</bean>
不建议使用这种方法,如果构造器中传入两个同类型参数,没办法区别。
<!--3、直接通过参数名设置-->
<bean id="user" class="com.zmqcode.User.User">
<constructor-arg name="name" value="zmq"/>
</bean>
在配置文件加载的时候,容器中管理的对象就已经被初始化了,即使没有在测试类中用到。
Spring的配置
<alias name="user" alias="别名"/>
<bean id="user" class="com.zmqcode.User.User" name="别名">
<constructor-arg name="name" value="zmq"/>
</bean>
第二种方法更常用,name=“别名 别名2,别名3”
可以用逗号,空格,分号等分隔,取多个别名。
<import resource="beans_service.xml"/>
<import resource="beans.xml"/>
导入多个配置文件
DI(Dependency Injection)
IoC 是一个概念,是一种思想,其实现方式多种多样。当前比较流行的实现方式是依赖注入。容器能知道哪个类运行的时候需要另外一个类,就是一个对象的使用需要另一个对象。
依赖:bean对象的创建依赖于容器
注入:bean对象中的所有属性,由容器来注入
构造注入
<bean id="user" class="com.zmqcode.User.User">
<constructor-arg name="name" value="zmq"/>
</bean>
Set注入【重点】
列举了不同类型的注入方式
<bean id="address" class="com.zmqcode.set.Address">
<property name="address" value="武汉"/>
</bean>
<bean id="student" class="com.zmqcode.set.Student">
<!--普通值注入-->
<property name="name" value="zmq"/>
<!--bean对象注入-->
<property name="address" ref="address"/>
<!--数组注入-->
<!--这种方式和上面的方式都可以使用-->
<property name="books">
<array>
<value>西游记</value>
<value>水浒传</value>
<value>红楼梦</value>
<value>三国演义</value>
</array>
</property>
<!--list注入-->
<property name="hobbits">
<list>
<value>听歌</value>
<value>看电影</value>
</list>
</property>
<!--map注入-->
<property name="card">
<map>
<entry key="身份证" value="123"/>
<entry key="银行卡" value="456"/>
</map>
</property>
<!--set注入-->
<property name="games">
<set>
<value>LOL</value>
<value>Dota</value>
</set>
</property>
<!--null注入-->
<property name="wife">
<null>
</null>
</property>
</bean>
扩展方式
p命名空间和c命名空间
- 导入依赖
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
- 修改xml文件,导入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"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:c="http://www.springframework.org/schema/c"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>
- 注入
<!--p命名空间注入。可以直接注入属性,property-->
<bean id="user" class="com.zmqcode.User.UserT" p:name="zmq" p:age="2"/>
<!--c命名空间注入。类似于构造器注入,需要是有参的,类似construct-args-->
<bean id="user2" class="com.zmqcode.User.UserT" c:age="2" c:name="zmq"/>