Spring DI依赖注入,自动装配

来源:互联网 发布:为什么要探索宇宙 知乎 编辑:程序博客网 时间:2024/06/11 16:18

1.  Spring DI 详解

什么是DI

依赖注入;说白了,就是给类中的属性赋值操作

几种注入方式

1      构造注入

2      Setter注入

2.1     Value:直接注入的真实的 “值”

2.2     Ref:bean的id,可以说是引用

2.3     数组注入

2.4     List注入

2.5     Map注入

2.6     Set注入

2.7     Null注入

2.8     Properties

public class User {

         private String name;

        

         private String[] books;

        

         private List<String> courses;

        

         private Map<String,String> cards;

        

         private Set<String> games

        

         private String wife;

        

         private Properties properties;

private Address address;

 

}

 

public class Address {

         private String name;

 

         public void setName(String name) {

                  this.name =name;

         }

 

         public Address(String name) {

                   super();

                   this.name =name;

         }

 

       @Override

         public String toString() {

                   return "Address [name=" +name +"]";

         }

}

注意:所有的属性必须有setter方法,要想显示出信息,要加上toString();方法!

<beanid="user"class="com.bjsxt.pojo.User"scope="prototype">

                   <propertyname="name"value="陈冠希"></property>

                   <!-- 数组注入 -->

                   <propertyname="books">

                            <array>

                                     <value>小白书</value>

                                     <value>白皮书</value>

                                     <value>把妹秘籍</value>

                            </array>

                   </property>

                   <!-- List 注入 -->

                   <propertyname="courses">

                            <list>

                                     <value>java从入门到精通</value>

                                     <value>java从精通到精辟</value>

                            </list>

                   </property>

                   <!-- Map注入 -->

                   <propertyname="cards">

                            <map>

                                     <entry>

                                               <key><value>ICBC</value></key>

                                               <value>工商银行</value>

                                     </entry>     

                                     <entrykey="ABC">

                                               <value>农业银行</value>

                                     </entry>                        

                            </map>

                   </property>

                   <!-- Set 注入 -->

                   <propertyname="games">

                            <set>

                                     <value>王者荣耀</value>

                                     <value>LOL</value>

                                     <value>dota</value>

                            </set>

                   </property>

                   <!-- 直接赋值为null -->

                   <!-- <property name="wife"><value>null</value></property> -->

                   <!-- null注入 -->

                   <propertyname="wife"><null/></property>

                   <!-- properties 注入 --> 

                   <propertyname="properties">

                                     <props>

                                               <propkey="driver">com.mysql.jdbc.Driver</prop>

                                               <propkey="url">jdbc:mysql://localhost:3306/mybatis</prop>

                                               <propkey="username">root</prop>

                                               <propkey="password">root</prop>

                                     </props>    

                   </property>

         </bean>

<!-- ref 注入address -->

         <propertyname="address"ref="address"></property>

2.  自动装配

Autowire

Default:默认,跟谁有关系!跟命名空间的default-autowire="default"有关系。

no:不注入。

Byname :按照名称来进行注入,但是,setter方法不能丢!内置还是走的setter方法。
<!-- userDao:正好跟UserServiceImpl中的userDao一致! -->

<beanid="userDao"class="com.bjsxt.dao.impl.UserOracleDaoImpl"></bean>

<beanid="mysql"class="com.bjsxt.dao.impl.UserMysqlDaoImpl"></bean>

<!-- ByName:按照名称来进行注入,名称指的是谁? -->

<beanid="userService"class="com.bjsxt.service.impl.UserServiceImpl"autowire="byName"/>

byType:按照类型注入,如果有多个匹配的话。则会报错,使用时请注意!

错误原因是:

<beanid="userDao"class="com.bjsxt.dao.impl.UserOracleDaoImpl"></bean>

<bean id="mysql"class="com.bjsxt.dao.impl.UserMysqlDaoImpl"></bean>

以上两个实现类都属于UserDao,而我们的UserServiceImpl只需要一个!

Constructor:构造注入

public UserServiceImpl(UserDaouserDao) {

        super();

        this.userDao =userDao;

    }

<beanid="userService"class="com.bjsxt.service.impl.UserServiceImpl"autowire="constructor"/>

 

 

default-autowire:在命名空间下使用,在命名空间下使用作用域是整个的配置文件。对所有的bean对象都起作用!

<?xmlversion="1.0"encoding="UTF-8"?>

<beansxmlns="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"

default-autowire="constructor"

则代表:配置文件中的全局都使用构造器注入!

问题:default-autowire="constructor"autowire="byName"同时存在的时候。怎么处理?

就近原则!

同时也适用于jscss

3.  总结

Spring:ioc(DI) 依赖注入,控制反转!

注入:就是给对象注入值

控制反转:则就是将对象的生命周期完全交给了spring容器来管理。

Spring-Ioc:为什么能够实现依赖注入,控制反转?原理!

基于反射,工厂。