Spring框架——IOC
Spring是轻量级的开源的JavaEE框架,可以解决企业应用开发的复杂性Spring有两个核心部分 :IOC和AOPIOC:(依赖注入——降低耦合度)控制反转 把创建对象过程交给Spring进行管理AOP:面向切面,不修改源代码进行功能增强dao层主要做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此service层主要负责业务模块的应用逻辑应用设计Controller层负责具体的业务
Spring是轻量级的开源的JavaEE框架,可以解决企业应用开发的复杂性
Spring有两个核心部分 :IOC和AOP
IOC:(依赖注入——降低耦合度)控制反转 把创建对象过程交给Spring进行管理
AOP:面向切面,不修改源代码进行功能增强
dao层主要做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此
service层主要负责业务模块的应用逻辑应用设计
Controller层负责具体的业务模块流程的控制 ,在此层要调用service层的接口来控制业务流程
Spring的核心就是提供了一个IoC容器,它可以管理所有轻量级JavaBean组件,提供的底层服务包括组件的生命周期管理、配置和组装服务、AOP支持,以及建立在AOP基础上的声明式事务服务等。
什么是IOC
控制反转,把对象创建和对象之间的调用过程,交给 Spring 进行管理
使用 IOC 目的:为了耦合度降低
IOC的底层原理
IOC的底层原理xml解析、工厂模式、反射
画图讲解IOC的底层实现原理
为什么IOC可以极大的降低耦合度?
解耦:更改某一层代码,不会影响其它层的代码,spring这样的框架,是面向接口编程的,表示层调用控制层,控制层调用业务层,业务层调用数据访问层
原始版本:在UserService
中调用UserDao
方法
工厂模式:
引入IOC:
IOC 降低耦合度,通过XML配置文件,配置创建的对象
通过反射创建对象
IOC操作Bean管理( xml 配置文件方式)
Bean管理指的是两个操作
(1)Spring创建对象
(2)Spring注入属性
Bean 管理操作有两种方式
(1)基于 xml 配置文件方式实现
(2)基于注解方式实现
基于xml方式创建对象
<beans>
<bean id="dataSource" class="HikariDataSource" />
<bean id="bookService" class="BookService">
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="userService" class="UserService">
<property name="dataSource" ref="dataSource" />
</bean>
</beans>
上面xml配置文件指示IOC容器创建3个JavaBean组件,并把把id为dataSource
的组件通过属性dataSource(即调用setDataSource()方
法)注入到另外两个组件中。
注意:在Spring的IOC容器中,我们把所有组件统称为JavaBean,即配置一个组件就是配置一个Bean。
(1)在 bean 标签有很多属性,介绍常用的属性 * id 属性:唯一标识 * class 属性:类全路径(包类路径)
)创建对象时候,默认也是执行无参数构造方法完成对象创建
基于 xml 方式注入属性
依赖注入就是注入属性
第一种注入方式:使用 set 方法进行注入
在xml配置文件中配置对象创建,配置属性注入
name
:类里面属性名称
value
:向属性中注入的值
第二种注入方式:使用有参数构造进行注入
Spring的IoC容器同时支持属性注入和构造方法注入,并允许混合使用。
总结
在设计上,Spring的IoC容器是一个高度可扩展的无侵入容器。
所谓无侵入,是指应用程序的组件无需实现Spring的特定接口,或者说,组件根本不知道自己在Spring的容器中运行。这种无侵入的设计有以下好处:
(1)应用程序组件既可以在Spring的IoC容器中运行,也可以自己编写代码自行组装配置;
(2)测试的时候并不依赖Spring容器,可单独进行测试,大大提高了开发效率。
装配Bean
xml注入外部bean
在service里面注入dao
每个<bean …>都有一个id标识,相当于Bean的唯一ID;
通过<property name="..." ref="..." />
注入了另一个Bean;
xml注入内部Bean
在员工里注入部门类
部门类:
main 方法
Spring容器通过读取XMl文件后使用反射完成
xml
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource">
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test" />
<property name="username" value="root" />
<property name="password" value="password" />
<property name="maximumPoolSize" value="10" />
<property name="autoCommit" value="true" />
</bean>
创建一个Spring的IOC容器实例,加载配置文件,让Spring容器为我们创建并配置好Bean
ApplicationContext context = new ClassPathXmlApplicationContext("application.xml"
从Spring容器中读取装备好的Bean并调用它
// 获取Bean:
UserService userService = context.getBean(UserService.class);
// 正常调用:
User user = userService.login("bob@example.com", "password");
完整的main()方法
public class Main {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
UserService userService = context.getBean(UserService.class);
User user = userService.login("bob@example.com", "password");
System.out.println(user.getName());
}
}
IOC容器BeanFactory
观察main代码
创建Spring容器的代码:
ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
Spring容器就是ApplicationContext
,他就是接口,里面有很多实现类,这里我们选择ClassPathXmlApplicationContext
,表示他会自动从classpath中查找指定的xml配置文件
获取ApplicationContext
,我们就获得了IOC容器的引用,从ApplicationContext中我们可以跟去Bean的ID获取Bean,但更多的时候我们根据Bean的类型获取Bean的引用:
UserService userService = context.getBean(UserService.class);
Spring中还提供另一种IOC容器BeanFactory
BeanFactory factory = new XmlBeanFactory(new ClassPathResource("application.xml"));
MailService mailService = factory.getBean(MailService.class);
BeanFactor
y和ApplicationContext的区别在于,BeanFactory的实现是按需创建,即第一次获取Bean时才创建这个Bean,而ApplicationContext会一次性创建所有的Bean。
实际上,ApplicationContext接口是从BeanFactory接口继承而来的,并且,ApplicationContext提供了一些额外的功能,包括国际化支持、事件和通知机制等。通常情况下,我们总是使用ApplicationContext,很少会考虑使用BeanFactory。
小结
Spring的IoC容器接口是ApplicationContext
,并提供了多种实现类;
通过XML配置文件创建IoC容器时,使ClassPathXmlApplicationContext
;
持有IoC容器后,通过getBean()
方法获取Bean的引用。
Bean的生命周期
生命周期:从对象创建到销毁的过程
2、bean 生命周期
- 通过构造器创建 bean 实例(无参数构造)
- 为 bean 的属性设置值和对其他 bean 引用(调用 set 方法)
- 调用 bean 的初始化的方法(需要进行配置初始化的方法)
- bean 可以使用了(对象获取到了)
- 当容器关闭时候,调用 bean 的销毁的方法(需要进行配置销毁的方法
配置后置处理器 Bean的生命周期一共有七步
在初始化前后添加第3步和第7步 - 通过构造器构建bean实例(无参数构造)
- bean的属性赋值(调用set方法)
- 把bean实例传递bean后置处理器的方法
postProcessBeforeInitializatio
n - 调用bean的初始化方法(需要进行配置初始化方法)
- 把bean实例传递bean后置处理器的方法
postProcessAfterInitialization
- bean可以使用了(对象获取到了)
- 当容器关闭的时候,调用bean的销毁的方法(需要进行配置销毁的方法)
IOC操作Bean管理(基于注解方式)
使用XML配置的优点是所有的Bean都能一目了然地列出来,并通过配置注入能直观地看到每个Bean的依赖。
它的缺点是写起来非常繁琐,每增加一个组件,就必须把新的Bean配置到XML中。
基于注解的配置:可以完全不需要XML,让Spring自动扫描Bean并组装它们。
Spring中针对Bean管理中创建对象提供注解
@Component
@Service
@Controller
@Repository
上面四个注解功能是一样的,都可以用来创建Bean
实例
实现步骤
第一步:引入依赖
第二步:开启组件扫描
第三步:
创建类 在类上面添加创建对象注解
注解里面是value属性值可以忽略不写 默认值是类名称,首字母小写
第四步:开启组件扫描细节配置
第五步:基于注解方式实现属性注入
@Autowired 创建对象注入属性
@Qualifier根据名称进行注入与@AutonWired一起使用
完全注解开发例子
注解使用@Autowired
就相当于把指定类型的Bean注入到指定的字段中。和XML配置相比,@Autowired大幅简化了注入,因为它不但可以写在set()方法上,还可以直接写在字段上,甚至可以写在构造方法中:
@Component
public class UserService {
MailService mailService;
public UserService(@Autowired MailService mailService) {
this.mailService = mailService;
}
...
}
创建配置类
@Configuration
@ComponentScan
public class AppConfig {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
UserService userService = context.getBean(UserService.class);
User user = userService.login("bob@example.com", "password");
System.out.println(user.getName());
}
}
除了main()方法外,AppConfig标注了ComponentScan
,它告诉容器,自动搜索当前类所在的包以及子包,把所有标注为@Component
的Bean自动创建出来,并根据@Autowired
进行装配
总结:
每个Bean被标注为@Component并正确使用@Autowired
注入,@Autowired
就相当于把指定类型的Bean注入到指定的字段中
配置类被标注为@Configuration
和@ComponentScan
;
更多推荐
所有评论(0)