DI (Dependencies Injection) 依赖注入
一 set注入
属性的注入,必须添加set方法。
执行过程:spring会找到所有的set方法,找到 setName 变形 –>name值与 进行匹配,如果匹配成功则进行赋值。
domain–Person:
applicationContext.xml :
set 为复杂类型赋值
通过set注入方式可以为复杂类型赋值 list、set、map、properties
Person:
applicationContext.xml :
二 构造器注入
如果对象创建时使用构造方法进行注入,则可以不写无参构造
使用构造方法进行注入时需要注意:
1.尽量使用index进行赋值
原因:在没有导入源码的条件下 IDE自动生成代码时 就会出现arg0,arg1的情况
2.参数的个数:
使用构造方法注入时 一定保证 构造参数匹配 否则会报错。
三 parent属性
在Spring容器中创建时,如果有子父级关系。需要通过parent属性指明。这样spring容器在创建对象时,帮助维护字符集关系。将dataSource注入到baseDao中,而不是它的子类
四 初始化—销毁方法
init-method="init"
destroy-method="destroy"
Spring容器可以直接调用初始化 和销毁方法,需要用户指明方法名称即可
五 autowire属性
autowire可以简化xml的配置,能够做到自动的装配,autowire有两种装配方式:
1.byName 必须先有set方法
首先会查找所有的set方法
setCat(Cat cat) –>去掉set把首字符小写–>cat–>与bean中的ID进行比较,
如果能够匹配,则能正确注入。如果匹配不到,则注入失败,容器也不会报错。
2.byType
setCat(Cat cat) –>去掉set把首字符小写–>cat–>找到对应的类型(包名.类名)–>然后与bean中的class进行匹配,如果匹配成功则注入。如果有重复的class,则报错!
六 全局的autowire
如果当前bean中配置了 autowire 则按照bean中配置的为准(就近原则)
七 属性注解
1 @Autowired – 两种注入方式有可能都会做,也可能会报错,先名称后类型。
有两种注入方式:1通过匹配属性的名称与bean中的ID匹配,匹配成功则注入,匹配不成功则按照类型去匹配,如果类型还没有匹配成功则报错。
按照指定的ID匹配
@Autowired
@Qualifier(value="catA")
如果想实现按照ID匹配,则必须借助@Qualifier(value="catA")
注解才能完成。
2 @Resource(name=”xxx”)
@Resource
注解的作用,其实就是@Autowired
和@Qualifier(value="catA")
的一个增强版。
使用一个注解就能够完成按属性名称匹配,按属性类型匹配,按照指定的ID匹配。
省略了:<property>
及set()
方法
<bean>
的个数没有减少
如果是大型文件,bean的数量是非常多的,引入了类的注解。
八 类的注解
1 开启包扫描
<context:component-scan base-package="xxx">
只要开启包扫描,默认开启属性注解!
多个包之间用逗号隔开,包的子孙包也会全部扫描到
@Component注解
为需要创建对象的类添加@Component注解,那么在Spring容器启动时,先按照包扫描给定的包进行扫描,当扫描到@Component注解的类时就会为当前的这个类创建对象,在创建对象的过程中,如果需要属性注入,则一并注入,将生成的对象存放到了Map中,Map中的Key就是当前类名首字母小写。
id的自动生成规则
当第二个字母大写则生成的ID就是类名PErson,如果第二个字母小写则首字母小写。
可以实现BeanNameAware接口,查看当前bean的id
@Component(value=”1608”) 指定bean的id
只有一个value的话,value可以省略
Spring为程序分层做了不同的注解,可以混用,
web @Controller
service @Service
dao @Repository
以上三个注解的作用和@Component一样,只是为了软件分层而设计的,方便程序员阅读。
九 引入外部配置文件
1.导入外部配置文件
<context:property-placeholder location="classpath:/jdbc.properties"/>
2.通过${配置文件的key}
能够得到value值
思路:
当Spring容器加载外部文件时会将key和value保存到Spring容器中,之后通过${xxx}
可以动态的获取值。
使用场景:
配置数据库的数据源时使用
Driver url username password
通过注解为基本类型赋值
@Value(xxx)
如果给复杂类型赋值 需要引入util头文件
面向接口编程
通过实现类实现接口的方式形成了接口与实现类的组合。在编程中通常属性的类型都是接口类型,这样做的好处是能够实现松耦合,这种编程方式叫做面向接口编程。
面向接口编程的好处是能够随意切换具体的实现类,而不用修改任何代码。
Spring的IoC和DI和面向接口编程的意义
使用Spring的IoC和DI,加上面向接口编程,
这样的代码结构可以做到最大程度的松耦合。