Spring再回首一:IOC与DI

1、spring管理bean的两种方式:xml和注解

2、bean实例化的3中方式:

  • 基于无参构造函数(常用)

注意类里面如果已经提供了一个有参数的的构造函数,一定还要给一个无参的构造函数。

  <bean class="cn.zxy.Person" id="person"></bean>
  • 静态工厂
<bean id="person" class="cn.zxy.factory.PersonStaticFactory" factory-method="createPerson">

这里的class是值得工程类所在的位置,后面的method指定的是通过那个静态方法获取到person的实例

  • 实例工厂(返回类的对象的方法不是静态的方法)
<!-- 实例工程方法需要先创建工厂实例,然后在创建所需对象的时候,将其赋值为factory-bean -->
<bean id="personFactory" class="cn.zxy.factory.PersonFactory"></bean>
<bean id="person2" factory-bean="personFactory" factory-method="createInstance"></bean>

3、bean的作用范围scope

singleton:单例的,不指定的时候默认就是这个。

prototype:原型,多例的。

request:spring创建一个bean对象,将对象存放在request域中

session:spring创建一个bean对象,将对象存放在session域中

globleSession:xxxx

4、spring属性的2种注入方式:

  • set方式注入(常用)
<bean class="cn.zxy.Person" id="person">
   <property name="name" value="zxy"></property>
   <property name="id" value="125"></property>
</bean>

注意类中对每一个要注入的域提供set方法,如果属性是另外一个对象,则value应该改为ref。ref给对应的beanid。

上述的注入方式可以换种方式写(p名称空间注入)。

<bean class="cn.zxy.Person" id="person" p:name="zxy" p:id="125"></bean>

命名空间p 的schema URI 为http://www.springframework.org/schema/p。如果你想使用命名空间p,只需要在Spring 的XML 配置中增加段声明

  • 有参构造注入(注意提供有参数构造方法):
 <bean class="cn.zxy.Person" id="person">
     <constructor-arg name="id" value="125"></constructor-arg>
     <constructor-arg name="name" value="zxy"></constructor-arg>
 </bean>

5、set方式注入复杂数据类型

数组、list、map、properties

6、IOC和DI

IOC:控制反转,将bean的管理交给spring。

DI:依赖注入,向类里面的属性设置值

两者之间的关系:依赖注入不能单独存在,依赖于IOC

7、spring管理bean注解方式

注解相关的类放在aop的jar里面了

开启注解扫描配置两种方式以及区别:

1、

<!-- 开启注解扫描,到包里面扫描类、方法、属性上面是否有-->
<context:component-scan base-package="com.bdqn.entity"></context:component-scan>

2、

<!--只扫描属性上的注解-->
<context:annotation-config></context:annotation-config>

创建对象的四种注解形式

  • Controller: 用于控制器的注解
  • Service : 用于service的注解
  • Component: 用于基本组件的注解
  • Repository:用于Dao层的注解

其实,对于spring来说,它根本无法识别controller,service等,它只知道只要你加了以上四个注解,它就帮你创建bean,简单来说,就是如果你在控制器上使用Component注解,或者使用Repository注解也是可以的,四种注解可以混用,但是,我们一般都按照上方所示的规则来使用注解,这样代码才有可读性

默认命名规则

  • 我们使用注解配置bean的时候,并没有指定bean的id,那么spring帮我们创建bean的时候会给一个默认的id,id为类名首字母小写。如TestController-> testController
  • 我们也可以指定bean的名称(id),使用注解的value属性,如@Service(value=”myService”)
  • value属性是注解的默认属性,可以省略,即@Service(“myService”)

注解注入属性(两种方式)

@Autowired:注解自动装配,无需指定是哪个bean的名称不常用

@Resource:常用,注解要求提供一个Bean名称的属性,若该属性为空,则自动采用标注处的变量或方法名作为Bean的名称.

@Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了。@Resource有两个属性是比较重要的,分是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。
  @Resource装配顺序
  1. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
  2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
  3. 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
  4. 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配; 

转载于:https://my.oschina.net/silence88/blog/840053

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值