首页 > 代码库 > Spring_day02

Spring_day02

:构造方法注入

index="参数的位置 0开始"

name="参数的名称"

ref="对象的引用" value="http://www.mamicode.com/具体的赋值" 二者不能同时出现

<constructor-arg index="0" name="name"  value="http://www.mamicode.com/TOM"></constructor-arg>

 

说明:

1.通过构造方法为属性赋值时,可以使用index 或者是name属性为属性赋值。index的起始值为0 name属性就是参数的名称。用的时候二者取其一就行。不过通常情况下使用Index最为安全

ref是注入的引用类型。value注入的是具体数值,二者不能共存取其一。

 

 

2.在使用构造方法进行注入的时候。配置文件中的构造参数。必须和实体类中的构造参数匹配。如果不匹配则报错

 

 

SpringIOCDI的意义:

1.如果在架构中webservicedao 应该尽可能的保持松耦合。如果各层之间紧耦合对于后期代码的维护,相当困难。

 

2.Spring可以通过配置文件的形式。动态的实现松耦合。如果将来具体的实现类发生了改变。只需要修改配置文件即可。无需手动修改代码。提高 了代码的开发效率和维护效率。并且其中所有的注入都是面向接口的,这样做能最大程度保证代码的灵活性。

 

Parent属性

parent="baseDao"

说明:Spring容器在创建对象的时候会根据bean的个数来创建对象。可是如果没有指明parent属性。指明子父级关系。那么Spring容器在创建对象的时候就不会自动的维护。所以在bean中如果有子父级关系。需要通过parent标签来指明。

2parent属性的使用场景:

对于架构层级而言。通过一些基础类,使用接口或父类继承的形式来达到简化代码的目的。可以使用parent属性

 

 

 

:自动的装配过程

如果类中的属性是引用类型,并且配置文件中有相应bean的配置。则能进行自动的装配。(自动的注入)

1autowire

1.1spring中可以通过autowire属性实现自动装配。将来不需要手动的在写property能够节省代码。

1.2使用装配过程必须添加set方法。否则装配失败 对象属性为null

2.装配的原理

2.1autowire="byName"

使用spring在进行装配的时候会先检查所有的set方法

setStudent====>student======>拿到student以后会根据bean中的ID进行匹配。如果匹配成功则能正确的注入。如果匹配不成功则为null

 

2.2autowire="byType"

使用spring在进行装配的时候会先检查所有的set方法

setStudent====>student===>拿到对应的Class形式====>根据bean中的class类型进行匹配。如果匹配成功则能正确注入。

 

Spring的属性注解

Spring为我们提供了属性注解的方式,能够简化开发。

 

 

 

 

1.@Autowired注入的原理

首先会根据属性的名称找对应的beanID,如果能正确匹配则正确注入。如果匹配不成功,则去找对应的class形式,通过class与bean中的class匹配。如果匹配则注入。否则匹配不成功,则报错

2.@Resource

用法和@Autowired一模一样,@Resource(name="Bean的ID")

一旦指明beanID,那么就会严格按照bean的ID去查找。不会再根据属性的ID和类型查找。

 

 

3.@Autowired和@Qualifier(value="http://www.mamicode.com/s1")一起使用的效果和@Resource(name="ID")效果相同。

通常情况下 我们使用@Resource注解

 

:类的注解

1.开启类扫描

   <context:component-scan base-package="domain"/>

说明:开启类扫描以后会自动的扫描给定的包及其子包,如果是多个包之间用“,”号隔开

 

2@Component注解使用的原理

1.首先Spring在进行xml解析时 会解析包扫描的标签。根据标签指定的包进行扫描。然后会到指定的包下查找那些类上有@Component注解,找到相应的注解后,会给这个类创建一个对象,创建好对象之后存入MAP中,会根据类的名称生成相应的ID(首字母小写其他不变)。

当作KEY存入map中。

 

2.ID生成的原则

如果第二个字母是大写的   ABcc  ==> 转化以后的ID就是ABcc

如果第二个字母小写    Abcc====>转化以后ID就是abcc

3@Value注解

@Value注解可以注入字符串和基本类型只需要将注入的值写到

@Value(value="http://www.mamicode.com/张三")即可。就能完成注入。

如果属性值只有value那么value可以省略不写。

 

3.1复杂类型的注入

父类类型的注入需要引入一个util这样的标签

 <util:map id="map">

                   <entry key="1" value="http://www.mamicode.com/"></entry>

                   <entry key="2" value="http://www.mamicode.com/TOM"></entry>

                   <entry key="3" value="http://www.mamicode.com/Jerry老鼠"></entry>

   </util:map>

要指明mapID 这个ID就是通过@Value("#{@ID}") ID应该保持一致。

4:动态数据注入---引入外部配置文件

   <context:property-placeholder location="classpath:/tom.properties"/>

原理说明:

spring进行解析的时候会根据指定的路径扫描对应的配置文件,扫描完成以后将配置文件的键值对进行保存。保存到spring容器中。需要使用的时候通过@Value("${key}")来获取相应的value值,实现了动态的注入效果。

 

5:类扫描的包容性

在开启类扫描的时候,会默认的开启属性注解。所以属性注解可以省略。

 

6:类的注解指明ID

@Component(value="http://www.mamicode.com/TomDao")

说明:使用这个注解的时候默认的条件下会根据类的名称按照首字母小写,自动的生成相应的Bean的ID

如果有value值 那么就会按照value指定的名称当做bean的ID

 

7:Spring的分层标识的注解

@Repository(value="http://www.mamicode.com/TomDao")    dao

@Service("TomService")                 service

@Controller                                        控制层

说明:Spring为了满足分层的需要 发明了三个注解 分别代码不同的层级

Spring_day02