java-spring
1、介绍
- IoC:Inversion of Control 控制反转
- 对象的创建控制权由程序转到外部,这种思想就叫控制反转
- Spring提供了一个容器叫
IoC容器
,用来充当IoC思想的外部
,用于提供对象。 - IoC容器负责对象的创建、初始化等一系列工作,被创建或被管理的对象在IoC容器中统称为
Bean
。 - DI(Dependency Injection)
依赖注入
。在容器中建立bean与bean之间依赖关系的整个过程,被称为依赖注入
。 - IoC和DI主要的目的就是为了充分
解耦
。
2、架构图
3、学习路线
4、代码
- 坐标
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>6.0.6</version>
</dependency>
- 配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="userDao" class="cn.tjhis.dao.impl.UserDaoImpl"/>
<bean id="userService" class="cn.tjhis.service.impl.UserServiceImpl">
<!-- name是UserServiceImpl的setUserDao去掉set后,首字母小写 ref 是上边bean的名称-->
<property name="userDao" ref="userDao"/>
</bean>
</beans>
- 代码
public class UserServiceImpl implements UserService {
private UserDao userDao;
@Override
public void save() {
userDao.save();
System.out.println("Service is Saving");
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
}
- 测试
public class Main {
public static void main(String[] args) {
// 获取上下文对象
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService service =(UserService) ctx.getBean("userService");
UserDao dao = (UserDao) ctx.getBean("userDao");
service.save();
}
}
5、创建bean的三种方式
- 第一种利用无参构造,不管是私有,但是必须是无参构造
- 静态工厂创造bean:使用静态工厂的好处是可以在创造对象前去初始化一些内容,比如配置文件,一般为兼容老的项目,了解即可。
- 非静态工厂
- 方式4 框架整合用的是这种方式,必须掌握
<!-- 这里会默认调用getObject的方法 -->
<bean id="userDao" class="cn.tjhis.factory.UserDaoFactoryBean"/>
public class UserDaoFactoryBean implements FactoryBean<UserDao> {
@Override
public UserDao getObject() throws Exception {
return new UserDaoImpl();
}
@Override
public Class<?> getObjectType() {
return UserDao.class;
}
/**
* 是否单例
*
* @return 单例
*/
@Override
public boolean isSingleton() {
return true;
}
}
6、生命周期
- 在impl中加入两个方法
public void init() {
System.out.println("init");
}
public void destroy() {
System.out.println("destroy");
}
- xml配置
<bean id="userService" class="cn.tjhis.service.impl.UserServiceImpl" init-method="init" destroy-method="destroy" >
<property name="userDao" ref="userDao"/>
</bean>
- destroy方法是不会 执行的,除非调用
ctx.close()
,这个方法在ApplicationContext
里面没有,但是ClassPathXmlApplicationContext
的父类AbstractApplicationContext
中才有。或者获取到ctx之后,调用一个钩子函数ctx.registerShutdownHook()
,这样,就会在虚拟机关闭时,调用destroy
;建议用钩子函数。
// 获取上下文对象
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
ctx.registerShutdownHook();
UserService service =(UserService) ctx.getBean("userService");
UserDao dao = (UserDao) ctx.getBean("userDao");
service.save();
- 第二种生命周期,实现
InitializingBean
和DisposableBean
这种方式不用设置init-method
和destroy-method
public class UserDaoImpl implements UserDao, InitializingBean, DisposableBean {
@Override
public void save() {
System.out.println("Dao is Saving");
}
// 销毁
@Override
public void destroy() throws Exception {
System.out.println("dao destroy");
}
// 初始化
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("dao init");
}
}
世界上没有什么事情是跑步解决不了的,如果有,那就再跑一会!