IoC
IOC容器
IoC是一种设计思想,面向对象编程
Spring通过IoC管理所有Java对象的实例化和初始化,控制对象之间依赖关系
将IoC容器管理的Java对象称为Spring Bean,与new创建的对象没有区别
控制反转(IoC Inversion of Controle)
指将对象的创建权力交给第三方容器负责
依赖注入(DI Dependency Injction)
Spring创建对象过程中,将对象依赖属性通过配置进行注入
DI是IoC思想的具体实现
IoC容器在Spring的实现
IoC容器是IoC思想的产品实现
IoC容器管理组件 -》 Spring的bean或对象
Spring提供的IoC容器实现方法:
BeanFactory
Spring内部接口,不提供给开发人员使用
ApplicationContext
BeanFactory子接口,更多高级特性,面向使用者
ApplicationContext主要实现类:
ClassPathXmlApplicationContext:
读取类路径XML配置文件创建IoC容器对象
FileSystemXmlApplicationContext:
读取系统路径XML配置文件创建IoC容器对象
基于XML管理Bean
ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
id属性是bean的唯一标识
HelloWorld bean = (HelloWorld)ac.getBean(“id”);
HelloWorld bean = (HelloWorld)ac.getBean(“id”);
还可以根据类获取(该类在XML中只能有一个)
不用强制转换成目标类
HelloWorld bean = ac.getBean(HelloWorld.class) ;
还可以标识和类都使用
HelloWorld bean = ac.getBean(HelloWorld.class,”id”) ;
使用setter注入依赖
创建类,在类中创建变量
变量创建set和get方法(或只产生set方法)
这样就可在Spring的xml中注入变量值
为不同对象类型属性赋值
使用外部bean
将XML中其他bean的id填入ref属性中
使用内部bean
在一对property之间创建bean
为数组类型属性赋值
为集合类型属性赋值
private List<> students;
为Map集合类型属性赋值
单实例bean
默认将bean实例化获得的对象是一样的
ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
Hello hello1 = ac.getBean("hello");
Hello hello2 = ac.getBean("hello");
hello1和hello2是同一个对象,
但是可以修改为多实例的对象
添加scope属性,其中singleton默认单实例,prototype是多实例
引入外部属性文件
在resources目录中常见properties类型文件
在文件中写入数据(name=value)
在Spring config的beans.xml中引入外部属性文件
最后,可以在beans中使用属性文件中的属性(${name})
基于注解管理Bean
Spring默认不使用注解
spring config中通过<context:component-scan> 元素开启 Spring Beans的自动扫描功能
自动扫描指定的包及其子类
若某类使用类@Component注解,就将该类装配到容器中来创建bean
@Component:
标识Spring中的Bean,可以应用在任何层次。
@Repository:
标识Bean,用于数据访问层(Dao层),负责与数据库进行交互
@Service:
标识Bean,用于业务层(Service层),调用数据访问层的方法来获取或修改数据
@Controller:
标识Bean,用于控制层(Controller层),处理用户的请求并响应
控制层 -> 业务逻辑层 -> 数据访问层。
开启自动扫描org.example包的类
使用Component注解来标识类
在注解中配置value属性或直接写值,作为该bean的id
bean对象实例化调用无参数构造方法,这里无参数构造方法直接赋值变量
最后在测试类中获取bean并执行
AutoWired注解自动注入
将bean自动注入到对应的类中
只在有注解管理的类中才能只用
省去了bean中配置对象类型<property>的过程
默认根据类型装配(byType),所以AutoWired注解不需要指定名字
创建注解管理的Hello类
创建注解管理的name类
使用Autowired注解注入Hello类
还可以将注解写在setter方法上
还可以将注解写在name的构造方法上
来注入Hello类
配合@Qualifier,让@Autowired根据名称注入
若同一类有多个bean时使用
Resource注解属性注入
和Autowired目的一样
但是Resource注解是根据名字注入的(byName)
若没有名字再byType寻找bean注入
@Resource是JDK扩展包的一部分,@AutoWired是Spring的一部分。
JDK扩展包需要额外引入