Spring第1天,IOC,DI,bean对象

Spring的IOC允许外部控制对象的创建,降低了程序间的耦合度。DI则是Spring自动处理对象之间的依赖关系,通过配置文件或注解实现bean的绑定。bean可以通过静态工厂、实例工厂等方式实例化,Spring默认使用无参构造器并通过反射创建对象。bean的生命周期包括初始化、活跃期和销毁等阶段。
摘要由CSDN通过智能技术生成

 Spring核心概念 

 怎么说呢?

IOC,假如我们一个Servlet已经被实现了,且部署到服务器中,但是我们由于业务逻辑需要更实现类,那我们是不是要重新停掉服务器等一系列工作,这样会很麻烦,而且程序之间耦合度偏高,所以Spring提供IOC容器,将对对象的创建放在容器里,他能根据我们程序外的代码来帮我们确定对象的创建。

IOC: 由外部创建对象,里面的对象成为bean。

DI: Spring会自动判断IOC中有依赖关系的bean,对他们进行绑定,看上述我们调用service,按程序执行dao层对象应该为创建,但是Spring已经我们创建好

bean配置

<?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">
    <!-- &lt;!&ndash;1.导入spring的坐标spring-context,对应版本是5.2.10.RELEASE&ndash;&gt; -->


    <!-- id是唯一标识符,class是你要创建的类,id是getbean就是用这个id来看的 -->
    <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl" name="dao"></bean>

    <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl"
          name="service service1 service2"
          scope="prototype">
        <!--  1.name就是起别名,可以多个用, ; 分割都可,但是建议还是用id作为唯一。
              2.scope,切换非单例模式,创还多个对象 -->
        
        <!-- 7.配置service和dao的关系
            property表示配置当前bean的属性,
            name属性表示配置哪一个具体的属性
            ref属性表示参照哪一个bean,ref对应bean的id
         -->
        <property name="bookDao" ref="dao"/>
    </bean>

</beans>

其实,你发现他这个其实不需要对象不同,而是通过对象进入的数据不同,因此一个对象,封装多个逻辑即可,产生不同的结果。 

错误调试

 从这里开始,错误需要一步步从下往上排查,不对但本身就是从底层出错点,往上抛的,不对,他都显示这个类里,先是方法再到类,

怎么说呢?遇到错误抛出点,从底层看,先自己读,如果读不懂就翻译。

bean的实例化

new bean的4种方式,实例工厂了解,因为在套娃

1.默认,不写了。

2.静态工厂,

你让spring new bean是静态工厂这个对象,但是你根本上是获取是new abean 对象,所以设置factory-method 方法啊,让他调用这个方法,来返回你想获取的对象。

3.原始实例工厂

4.创新的实例工厂

 /*
        * AppForInterstanceUser*/


public class AppForInstanceUser {
    public static void main(String[] args) {

        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        // 创建实例工厂对象,实例工厂对象里面已经通过反射来获取你要的对象类型和对象(实际类型)
        UserDao userDao1 = (UserDao) ctx.getBean("userDao1");

        System.out.println(userDao1);

        userDao1.save();

    }
}



/**
* UserDaoFactoryBean
*@return
*/



//FactoryBean创建对象
public class UserDaoFactoryBean implements FactoryBean<UserDao> {
    // 获取对象
    public UserDao getObject() throws Exception {
        return new UserDaoImpl();
    }

    // 获取对象类型
    public Class<?> getObjectType() {
        return UserDao.class;
    }

    // 判断是否单例
    @Override
    public boolean isSingleton() {
        return false;
    }
}
<?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">

    
    <!--方式四:使用FactoryBean实例化bean-->
    <bean id="userDao1" class="com.itheima.factory.UserDaoFactoryBean"/>

</beans>

1.Spring ioc new bean 给我们默认调用无参构造方法,通过反射来调用,反射,反正就是程序的任何部分,假如我们拿到一类的Class实例,知道相应的字符串名,那么我们可以调用里面相应的方法或者修改相应的属性,这么说的话,spring通过配置文件拿到我们配置相应的class实例字符串,然后给我们将对象new出来

bean生命周期

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

本郡主是喵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值