Spring中IOC容器

IOC入门案例思路分析

1.管理什么(Service和Dao)

2.如何将管理的对象存放到IOC容器(配置applicationContext.xml)第二步

3.将管理的对象存放到IOC容器,如何获取IOC容器 第三步

4.获取到IOC容器后,如何从容器中获取bean(即管理的对象)第四步

5.使用Spring导入坐标(pom.xml)第一步

基本内容

package com.huhu.dao;

public interface BookDao {
    void save();
}

package com.huhu.dao.impl;

import com.huhu.dao.BookDao;

public class BookDaoImpl implements BookDao {

    public void save() {
        System.out.println("Bookdao save ....");
    }
}
package com.huhu.service;

public interface BookService {
    void save();
}
package com.huhu.service.impl;

import com.huhu.dao.BookDao;
import com.huhu.service.BookService;

public class BookServiceImpl implements BookService {
    private BookDao bookDao=new BookDaoImpl();
    public void save() {
        System.out.println("BookService save ....");
        bookDao.save();
    }
}

第一步:导入坐标

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.10.RELEASE</version>
        </dependency>
    </dependencies>

第二步:配置bean

  <bean id="bookDao" class="com.huhu.dao.impl.BookDaoImpl"/>

  <bean id="bookService" class="com.huhu.service.impl.BookServiceImpl"/>
 

第三步:获取IOC容器和 第四步:获取bean 

package com.huhu;

import com.huhu.dao.BookDao;
import com.huhu.service.BookService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App2 {
    public static void main(String[] args) {
        ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
        BookDao bookDao = (BookDao) ctx.getBean("bookDao");
        bookDao.save();
        System.out.println();
        BookService bookService = (BookService) ctx.getBean("bookService");
        bookService.save();
    }
}

实现结果: 

 

DI 入门案例

基本内容与上面差不多,唯一修改的就是BookServiceImpl类

package com.huhu.service.impl;

import com.huhu.dao.BookDao;
import com.huhu.service.BookService;

public class BookServiceImpl implements BookService {
    private BookDao bookDao;
    public void save() {
        System.out.println("BookService save ....");
        bookDao.save();
    }

    public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }
}

bean配置 ref中bookDao与bookDaoImpl类注入bean定义id属性值bookDao一致

    <bean id="bookDao" class="com.huhu.dao.impl.BookDaoImpl"/>

    <bean id="bookService" class="com.huhu.service.impl.BookServiceImpl">
        <property name="bookDao" ref="bookDao"/>
    </bean>

 测试结果依旧不变

bean起别名添加name属性 

获取bean可以使用name属性值也可以id属性值(建议id)

<bean id="bookDao" name="dao" class="com.huhu.dao.impl.BookDaoImpl"/>

    <bean id="bookService" class="com.huhu.service.impl.BookServiceImpl">
        <property name="bookDao" ref="dao"/>
    </bean>

bean作用范围配置默认单例

package com.huhu;

import com.huhu.dao.BookDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {
    public static void main(String[] args) {
        ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
        BookDao bookDao = (BookDao) ctx.getBean("bookDao");
        BookDao bookDao2 = (BookDao) ctx.getBean("bookDao");
        System.out.println(bookDao);
        System.out.println(bookDao2);
    }
}

修改单例的话在配置文件编辑scope域=prototype

<bean id="bookDao" name="dao" class="com.huhu.dao.impl.BookDaoImpl" scope="prototype"/>

    <bean id="bookService" class="com.huhu.service.impl.BookServiceImpl">
        <property name="bookDao" ref="dao"/>
    </bean>

 

bean创建方式

第一种:默认无参构造方法(可不写) (private也可以被调用使用反射)一旦加了有参就必须写上无参构造方法

<bean id="bookDao" name="dao" class="com.huhu.dao.impl.BookDaoImpl"/>
public class BookDaoImpl implements BookDao {
    private BookDaoImpl(int i){
        System.out.println("Bookdao constructor is running...");
    }
    public void save() {
        System.out.println("Bookdao save ....");
    }
}

没有无参构造方法后,报错Caused by: java.lang.NoSuchMethodException: com.huhu.dao.impl.BookDaoImpl.<init>() 

第二种:静态工厂 (早期使用最多,了解即可)(基本内容如下)

package com.huhu.dao;

public interface OrderDao {
    void save();
}
package com.huhu.dao.impl;

import com.huhu.dao.OrderDao;

public class OrderDaoImpl implements OrderDao {
    public void save() {
        System.out.println("OrderDao save ...");
    }
}
package com.huhu.factory;

import com.huhu.dao.OrderDao;
import com.huhu.dao.impl.OrderDaoImpl;

public class OrderDaoFactory {
    public static OrderDao getOrderDao(){
        return new OrderDaoImpl();
    }
}
package com.huhu;

import com.huhu.dao.OrderDao;
import com.huhu.factory.OrderDaoFactory;

public class AppForInstanceOrder {
    public static void main(String[] args) {
        //通过静态工厂创建对象
        OrderDao orderDao = OrderDaoFactory.getOrderDao();
        orderDao.save();
    }
}

使用静态工厂实例化bean

<!--使用静态工厂实例化bean-->
    <bean id="orderDao" class="com.huhu.factory.OrderDaoFactory" factory-method="getOrderDao"/>
package com.huhu;

import com.huhu.dao.OrderDao;
import com.huhu.factory.OrderDaoFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class AppForInstanceOrder {
    public static void main(String[] args) {
        //通过静态工厂创建对象
//        OrderDao orderDao = OrderDaoFactory.getOrderDao();
//        orderDao.save();

        ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
        OrderDao orderDao = (OrderDao) ctx.getBean("orderDao");
        orderDao.save();
    }
}

 

第三种:实例工厂 (基本内容如下) 

package com.huhu.dao;

public interface UserDao {
    void save();
}
package com.huhu.dao.impl;

import com.huhu.dao.UserDao;

public class UserDaoImpl implements UserDao {
    public void save() {
        System.out.println("UserDao save ...");
    }
}
package com.huhu.factory;

import com.huhu.dao.UserDao;
import com.huhu.dao.impl.UserDaoImpl;

public class UserDaoFactory {
    public UserDao getUserDao(){
        return new UserDaoImpl();
    }
}
package com.huhu;

import com.huhu.dao.UserDao;
import com.huhu.factory.UserDaoFactory;

public class AppForInstanceUser {
    public static void main(String[] args) {
        UserDaoFactory userDaoFactory = new UserDaoFactory();
        UserDao userDao = userDaoFactory.getUserDao();
        userDao.save();
    }
}

 使用实例工厂实例化bean

<!--使用实例工厂实例化bean-->
    <bean id="userFactory" class="com.huhu.factory.UserDaoFactory"/>
    <bean id="userDao" factory-method="getUserDao" factory-bean="userFactory"/>
package com.huhu;

import com.huhu.dao.UserDao;
import com.huhu.factory.UserDaoFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class AppForInstanceUser {
    public static void main(String[] args) {
//        UserDaoFactory userDaoFactory = new UserDaoFactory();
//        UserDao userDao = userDaoFactory.getUserDao();
//        userDao.save();

        ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
        UserDao userDao = (UserDao) ctx.getBean("userDao");
        userDao.save();
    }
}

 

优化创建UserDaoFactoryBean类代替UserDaoFactory类(实用)

package com.huhu.factory;

import com.huhu.dao.UserDao;
import com.huhu.dao.impl.UserDaoImpl;
import org.springframework.beans.factory.FactoryBean;

public class UserDaoFactoryBean implements FactoryBean<UserDao> {
    //代替原始实例工厂中创建对象的方法
    public UserDao getObject() throws Exception {
        return new UserDaoImpl();
    }

    //获取对象类型
    public Class<?> getObjectType() {
        return UserDao.class;
    }
}
<!--使用FactoryBean实例化bean-->
    <bean id="userDao" class="com.huhu.factory.UserDaoFactoryBean"/>

bean生命周期 

暴力关闭容器(实际开发不使用)

package com.huhu.dao.impl;

import com.huhu.dao.BookDao;

public class BookDaoImpl implements BookDao {
    public void save() {
        System.out.println("Bookdao save ....");
    }

    public void init(){
        System.out.println("init ...");
    }

    public void destroy(){
        System.out.println("destroy ...");
    }
}
<bean id="bookDao" name="dao" class="com.huhu.dao.impl.BookDaoImpl" init-method="init" destroy-method="destroy"/>
ClassPathXmlApplicationContext子类型替代ApplicationContext父类型,才可关闭容器
package com.huhu;

import com.huhu.dao.BookDao;
import com.huhu.service.BookService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App2 {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
        BookDao bookDao = (BookDao) ctx.getBean("dao");
        bookDao.save();
        ctx.close();
    }
}

 设置关闭钩子(哪个位置都可以)在虚拟机退出前先关闭容器在退出虚拟机

package com.huhu;

import com.huhu.dao.BookDao;
import com.huhu.service.BookService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App2 {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
        BookDao bookDao = (BookDao) ctx.getBean("dao");
        bookDao.save();
//        ctx.close();
        ctx.registerShutdownHook();
    }
}

优化篇实现接口(了解即可)

<bean id="bookService" class="com.huhu.service.impl.BookServiceImpl">
        <property name="bookDao" ref="dao"/>
    </bean>
package com.huhu.service.impl;

import com.huhu.dao.BookDao;
import com.huhu.service.BookService;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;

public class BookServiceImpl implements BookService, InitializingBean, DisposableBean {
    private BookDao bookDao;
    public void save() {
        System.out.println("BookService save ....");
        bookDao.save();
    }

    public void setBookDao(BookDao bookDao) {
        System.out.println("set...");
        this.bookDao = bookDao;
    }

    public void destroy() throws Exception {
        System.out.println("BookService destroy ...");
    }

    public void afterPropertiesSet() throws Exception {
        System.out.println("BookService init ...");
    }
}
package com.huhu;

import com.huhu.dao.BookDao;
import com.huhu.service.BookService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App2 {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
        BookDao bookDao = (BookDao) ctx.getBean("dao");
        bookDao.save();
//        ctx.close();
        ctx.registerShutdownHook();
    }
}

结果如下:

总结:初始化容器

步骤:1创建对象 2执行构造方法 3执行属性注入(set)4执行bean初始化方法 

使用bean:执行业务操作

关闭/销毁容器:执行bean销毁方法(容器关闭前触发bean的销毁)

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值