程序员的春天-Spring学习02

程序员的春天-Spring学习02

Spring Ioc DI

DI:依赖注入(Dependency Injection)
这个注入可以理解为给对象赋值

基于XML的DI

设值注入

设值注入,底层使用的是pojo类的get和set方法,所以说实体类要写了get和set方法才能是用设值注入

  • 简单数据类型和引用数据类型注入
<bean id="star" class="top.byfree.pojo.Star">
	<!--简单数据类型用value-->
        <property name="name" value="jelly"/>
        <property name="age" value="17"/>
	<!--引用数据类型要用ref关联其他的bean-->
        <property name="partner" ref="partner"/>
</bean>

property标签的属性

属性作用
name标识要注入的属性名称,用来找set方法
value标识要注入简单数据类型的值
ref标识要注入的引用类型的bean的id
  • 集合属性注入

集合注入和值注入不怎么一样需要用到property下的子标签
数组的注入演示

<bean id="testService" class="top.byfree.pojo.testservice">
        <property name="myArray">
            <array>
                <value>张三</value>
                <value>李四</value>
            </array>
        </property>
</bean>
集合使用标签标签子标签格式补充
Arrayarray<value>张三</value>value或ref取决于是否是引用类型
Listlist<value>李四</value>value或ref取决于是否是引用类型
Setset<ref bean="partner"/>value或ref取决于是否是引用类型
Mapmap<entry key="qq" value="1416629681"/>key-value就相当于map中的key-value
Propertiesprops<prop key="兴趣">足球</prop>
  • 域属性自动注入

分为局部设置和全局设置
其实就是针对引用类型的自动注入

局部设置
在要设置的bean标签上添加autowire属性
标签属性

属性作用注意
byName设置关于id的自动注入注入的id必须和被注入的属性名一致
byType设置关于类型的自动注入该类型的bean只能有一个不然会报错

全局设置
在beans标签上添加default-autowire标签并填写属性值位byName或者byType

  • 空字符串或null注入

空字符串
在property标签的value中写“”即可或者不写value标签,为property标签添加子标签<value/>

<property name="name">
	<value/>
</property>

null
为property标签添加子标签<null/>

<property name="name">
	<null/>
</property>

构造注入

构造注入要求必须要有全参构造器,不要忘写无参构造器

构造注入不在使用property标签而是使用constructor-arg标签表示构造其中的形参

  1. 基于形参名的设置
<bean id="star" class="top.byfree.pojo.Star">
	<constructor-arg name="name" value="小胖" />
        <constructor-arg name="age" value="18" />
        <constructor-arg name="partner" ref="partner" />
</bean>

这里的name和value或者ref和之前的property标签的含义一致

  1. 基于形参顺序的设置
<bean id="star5" class="top.byfree.pojo.Star">
        <constructor-arg index="0" value="小胖" />
        <constructor-arg index="1" value="18" />
        <constructor-arg index="2" ref="partner2" />
</bean>

index 表示形参是第几个

  1. 自动设置
<bean id="star5" class="top.byfree.pojo.Star">
        <constructor-arg value="小胖" />
        <constructor-arg value="18" />
        <constructor-arg ref="partner2" />
</bean>

不写name和index也可以自动绑定,但是这里的constructor-arg标签顺序要和构造器形参里的完全对应

基于注解的DI

添加注解扫描

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">  
</beans>

新的dtd约束

代码

<context:component-scan base-package="top.byfree.pojo"/>

@Component注解

使用在实体类上面,用于将这个类交给spring容器管理

@Component("myPartner")
public class Partner {
}

可以传参数,相当于赋予其id

@Value注解

用于注入一个基本类型的属性

@Value("jelly")
private String name;

@Autowired注解

用于注入一个引用属性的值

@Autowired
private Partner partner;

默认是用byType的方式,可以再次添加@Qualifier注解使其变为byName的方式

@Autowired
@Qualifier("myPartner")
private Partner partner;

@Resource注解

也是用于注入一个引用属性的值
区别于Autowired,Autowired是spring包下的注解而且会线以byType,而Resource是jdk包下的而且默认是用byName只有找不到匹配的name后才会是用byType

@Resource
private Partner partner;

和@Component相同功能的还有3个注解

@Repository注解:该注解添加在DAO实现类上
@Service注解:该注解添加在Service实现类上
@Controller注解:该注解添加在Controller类上

@Scope注解

通过注解设置作用域
prototype或者singleton

@Component
@Scope("prototype")
public class Star implements Serializable {
}

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://www.byfree.top/archives/spring02