一.IOC和DI
1.IoC:指将对象的创建权,反转给了Spring容器;
不是什么技术,而是一种设计思想,好比于MVC。就是将原本在程序中手动创建对象的控制权,交由Spring框架来管理。
正控:若调用者需要使用某个对象,其自身就得负责该对象的创建。
反控:调用者只管负责从Spring容器中获取需要使用的对象,不关心对象的创建过程,也就是把创建对象的控制权反转给 Spring框架。
2.DI:Dependency Injection(依赖注入):
指Spring创建对象的过程中,将对象依赖属性(简单值,集合,对象)通过配置设值给该对象。
IoC和DI其实是同一个概念的不同角度描述,DI相对IoC而言,明确描述了“被注入对象依赖IoC容器配置依赖对象”。
3.Container:容器,在生活中容器就是一种盛放东西的器皿,从程序设计角度看作是装对象的对象,
因为存在对对象的存入、取出等操作,所以容器还要管理对象的生命周期。
二. DI注入方式
1.对象注入(setter和构造器注入)
手动装配(XML bean方式)
自动装配(注解方式).
2.属性注入
使用bean元素的
简单类型值,直接使用value赋值;
引用类型,使用ref赋值;
集合类型,直接使用对应的集合类型元素即可。
spring通过属性的setter方法注入值;
在配置文件中配置的值都是string,spring可以自动的完成类型的转换
属性的设置值是在init方法执行之前完成的
set1
set2
set3
list1
list2
list3
arr1
arr2
arr3
v1
v2
v3
@Setter
@Getter
public class Employee {
private Long id;
private String name;
private Integer age;
private String address;
}
@Setter
@Getter
public class CollectionBean {
private Set set;
private List list;
private String[] array;
private Map map;
private Properties pro;
}
三.Spring提供的装配标签:
Autowired和Qualifier标签:
1.通过@Autowired标签可以让Spring自动的把属性需要的对象从Spring容器找出来,并注入给该属性。
2.第三方程序:Spring3.0之前,需要手动配置@Autowired解析注解程序,Spring就会自动的加入针对@Autowired标签的解析程序。
从Spring3.0开始,可以不再需要改配置了。如果不在Spring的测试环境中,也找到@Autowired的解析代码,此时页必须配置.
3.@Autowired标签贴在字段或者setter方法上。
4.@Autowired可以同时为一个属性注入多个对象。
public void setXxx(OtherBean1 other1,OtherBean2 other2) {}
5.使用@Autowired标签可以注入Spring内置的重要对象,比如BeanFactory,ApplicationContext。
6.测试类:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class SpringTest {
@Autowired
private ApplicationContext ctx;
}
6.默认情况下@Autowired标签必须要能找到对应的对象。可使用required=false来避免该问题:@Autowired(required=false)
7.@Autowired找bean的方式:
1)、首先按照依赖对象的类型找,如果找到则使用setter方法或者字段直接注入;
2)、如果在Spring上下文中找到多个匹配的类型,再按照名字去找,如果没有匹配则报错;
3)、可以通过使用@Qualifier("otherBean")标签来规定依赖对象按照bean的id+类型去找;
四.JavaEE提供的装配标签:
@Resource标签:
1.@Resource标签是JavaEE规范的标签;也可以作用于字段或者setter方法;必须要求有匹配的对象;
5.
2.@Resource标签找bean的方式:
1),首先按照名字去找,如果找到,就使用setter或者字段注入;
2),如果按照名字找不到,再按照类型去找,但如果找到多个匹配类型,报错;
3),可以直接使用name属性指定bean的名称;但是,如果指定的name,就只能按照name去找,如果找不到,就不会再按照类型去找;
五.使用标签简化IoC:
1.使用标签来完成IoC,就必须有IoC标签的解析器:
使用context:component-scan来扫描spring需要管理的bean
base-package就告诉spring,去哪些包及其子包里去扫描bean,如果有多个包需要被扫描;只需要用逗号隔开多个包即可
2.标注Bean的注解:@Component
默认情况,直接使用类的名字(首字母小写作为bean的名字)
如果要修改bean的名称;直接使用value属性来重新定义bean的名称
@Component("otherbean")
3.使用@Component的限制:
1),不能运用到静态工厂方法和实例工厂方法,但是可以使用到FactoryBean;
2),对于没有源代码的类(框架内部的预定义类),只能用XML配置;
4.bean组件版型标签
bean组件版型:
@Service用于标注业务层组件、
@Controller用于标注控制层组件(如struts中的action)、
@Repository用于标注数据访问组件,即DAO组件。
@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
5.指定bean的作用域:@Scope("prototype")
6.初始化和销毁方法
@PostConstruct
public void init() {
相当于
@PreDestroy
public void destory() {
相当于
7.选用xml还是注解:
1),Annotation:使用方便,XML文件很小,但是,依赖关系又重新回到了代码当中;
2),XML:使用稍微复杂,但是,代码很干净,代码不会很任何框架产生关系;XML安全;