一、以前属性复制的方法(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}”