java-spring

1、介绍

  • IoC:Inversion of Control 控制反转
  • 对象的创建控制权由程序转到外部,这种思想就叫控制反转
  • Spring提供了一个容器叫IoC容器,用来充当IoC思想的外部,用于提供对象。
  • IoC容器负责对象的创建、初始化等一系列工作,被创建或被管理的对象在IoC容器中统称为Bean
  • DI(Dependency Injection) 依赖注入。在容器中建立bean与bean之间依赖关系的整个过程,被称为依赖注入
  • IoC和DI主要的目的就是为了充分解耦

image

2、架构图

image

3、学习路线

image

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:使用静态工厂的好处是可以在创造对象前去初始化一些内容,比如配置文件,一般为兼容老的项目,了解即可。
    image
  • 非静态工厂
    image
  • 方式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();
  • 第二种生命周期,实现InitializingBeanDisposableBean这种方式不用设置init-methoddestroy-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");
    }
}

image

posted @ 2023-03-04 08:43  his365  阅读(10)  评论(0编辑  收藏  举报