您的位置:首页 > 编程语言 > Java开发

spring框架之DI

2016-10-13 13:03 106 查看

一、以前属性复制的方法(1、通过构造方法
2、通过set方法)

1.使用Spring容器利用其set方法给属性赋值

<bean id="" class="">

<property name="addr(属性名)" value="北京昌平(值)"></property>   实体类中需要有对应的set方法

</bean>  value给基本类型赋值

底层调用的是set方法  与实体类中的属性没有关系,是通过set方法建立的链接。

底层的实现:根据<property name="addr(属性名)">找到实体类中的setName()方法====然后去掉set变成name。通过形参传递参数给实参赋值

2.使用Spring容器给对象赋值

<bean id="" class="">

<property name="student(对象名)"
ref=”student(对象的id)”></property>实体类中需要有对应的set方法
 ref为引用类型赋值value赋值固定值

</bean>   ref给注入的对象赋值

<bean id=”student” class=””></bean>

3.使用Spring容器给String类型赋值、List、Set、Map(复杂类型)

<bean id="" class="">

<property name="student(对象名)"  >

<array>

<value>hahaha</value>            写String类型的set方法

</array>

</property>   实体类中需要有对应的set方法

</bean>

<list>

<value>hahaha</value>            写list类型的set方法

</list>

<set>

<value>去重功能</value>

</set>

<map>

<entry key=””  value-ref=””></entry>

<entry key=””  value=””></entry>

</map>

Properties prop

<property id=””>

</property>

 

二、通过构造方法赋值

模板:当不一定全有

<bean id="" class="">

<Constructor-arg  index=”参数的位置(从0开始)” name=”参数的名称”  ref=”引用bean的ID”  value=”固定的值”  type=”类型”></>

</bean>

Index与name指定的是同一个对象:可以只写其中一个(建议使用index?),但当index与name一起写时,两个都必须正确。

原因:当没有关联源码时,形式参数可能会变成arg的形式,导致name属性赋值失败,所以建议使用index进行赋值

注:因为是使用的无参构造进行赋值,则类中必须要有无参的构造方法。

 

三、

问:在每一个都需要数据源,如果没有简化的配置,就需要重复的配置,如何来简化呢?

答:写一个基类,在基类中写一个数据源,让所有的实现类继承此基类。  基类可以不创建其对象  可以添加abstract=true以不创建其对象

注:是在bean时需要写上parent属性
指明子父级的关系。(Spring在创建对象的时候不知道需要维护子父级的关系,所以需要明确的指明)

 

标签:

Abstrac:true

Parent:

Autowire:  简化xml配置,就不需要写引用类型的赋值

用法:【底层是根据set方法来做的(找到所有的set方法(setPerson)==>找到对应的属性(person)==>去bean中找id=person的类)

 autowire=“byName”根据属性的名称和bean的ID进行匹配。】

Autowire=“byType”通过类型进行匹配,【找到所有的set方法===>找到对应的属性(person)==>根据属性去找类型===>根据类型去找bean中的class】

全局的default-autowire

 

属性注解注入步骤:1.在xml头中引入Context头文件:xmlns:context="http://www.springframework.org/schema/context"

  2.开启属性<context:annotation-config/>注解开关

  3.在属性上使用对应的注解@value(给基本类型和String进行赋值)、@autowired(给引用类型进行赋值)

    【autowired的注入原理:会根据属性的名称去bean中找到对应的ID,如果正确匹配则进行注入;如果匹配不成功则会匹配

类型(class),匹配成功进行注入,如果匹配不成功则报错】

扩充:如果想指定bean的ID进行注入可以是用Qualifier(value=“”),当@autowired与@Qualifier两个一起用时,只有@Qualifier生效。

@Resource用法与@autowired一致     当使用@Resource(name=“”)表名使用ID注入与@autowired与@Qualifier用法一样。

 

 

类的注解:(以后不需要在写set方法)

使用步骤:1.开启<context:component-scan base-package=”domain,dao”/>
类扫描(包含了属性的注解) 多个包之间用“,”号隔开。

     2.在需要创建对象的类上写@Component注解    注:开启了类扫描属性的开关也相当于已经开

【实现原理:通过类扫描器找到相应的包,扫描所有包下的类,如果有Component注解,就个这个类创建对象,对象的id就是类名,

首字母小写,存入Map中供我们使用。】

Component的属性value值,@component(value=“p”)则会将对应的类的Id改成p。

 

注解的分层:@Repository供DAO层使用

@Service供Service层使用

@Controller供控制层使用  作用与component一致。

 

单例、多例 懒加载也能通过注解来做。

@Scope("prototype")?

@Lazy(true)?

 

动态读取外部文件:将配置信息加载到容器中

!!!<context:property-placeholder location=”classpath:spring.properties”>

使用时“${key}”
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring 框架 DI