spring学习笔记-初步理解IOC容器

1.创建一个简单的spring项目

1. 创建一个java项目,并导入spring-core的依赖jar包
在项目下创建一个lib文件夹,将spring的核心jar包放入该文件夹,并将jar包引入项目(build path)
在这里插入图片描述
2. 创建applicationContext.xml
2.1. 在src(类的根路径)下创建一个xml文件,并写入统一的头声明

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
      	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
		xmlns:context="http://www.springframework.org/schema/context"
      xsi:schemaLocation="
            http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context
          	http://www.springframework.org/schema/context/spring-context.xsd">

      

</beans>

因为src文件夹是源码文件夹,源码包下的所有文件都会合并编译放入bin下,而这个bin就是我们java项目的开始。
java类路径开始的地方:/bin/
web项目类路径开始的地方:/WEB-INF/classes/
在这里插入图片描述
在这里插入图片描述

3. 注入依赖信息,并给依赖赋值
3.1. 创建一个简单的class

package com.hao.testSpring;
public class User {
      private String userName;
      private String sex;
      private Integer age;
      
      public String getUserName() {
            return userName;
      }

      public void setUserName(String userName) {
            this.userName = userName;
      }

      public String getSex() {
            return sex;
      }

      public void setSex(String sex) {
            this.sex = sex;
      }

      public Integer getAge() {
            return age;
      }

      public void setAge(Integer age) {
            this.age = age;
      }

      @Override
      public String toString() {
            return "User [userName=" + userName + ", sex=" + sex + ", age=" + age + "]";
      }
}

3.2. 将该对象注入IOC容器中
在这里插入图片描述

<bean id="User" class="com.hao.testSpring.User">
            <property name="userName" value="qianghao">             </property>
            <property name="sex" value="男"></property>
            <property name="age" value="26"></property>
 </bean>
  • 使用bean来引入依赖对象

    • id指定该对象在IOC容器中的唯一名称
    • class指定对象的位置信息,class的值为该class所在的完成的包路径
    • 一个beans中可以注入多个对象
  • 使用property引入属性

    • name指定对象的属性,该属性就是class中的属性名称
    • value是初始化值

4. 如何使用已经被注入的对象
在这里插入图片描述
4.1. 首先获取IOC容器,new一个ClassPathXmlApplicationContext对象,参数为“applicationContext.xml”,当然这个xml的名称是可以随意取的(但是为了方便之后集成hibernate一般就默认为“applicationContext.xml”)

ApplicationContext ac = new 
ClassPathXmlApplicationContext("applicationContext.xml");

4.2. 使用getBean()方法从容器中取出需要使用的对象,参数为该对象在容器中的ID

User bean = (User) ac.getBean("User");

4.3. 打印对象

2.初步理解IOC容器

2.1. applicationContext是IOC容器的接口
applicationContext.xml是spring最核心的文件,初期在我们不能很好地理解容器这个抽象概念时,我们可以简单的将该文件看做就是那个IOC容器,我们需要将我们的依赖给放到这里,以供我们使用。
创建IOC容器:

ApplicationContext ac = new 
ClassPathXmlApplicationContext("applicationContext.xml");

该方法指的是在classPath(类路径下)的ApplicationContext的位置在哪,所以我们尽量将ApplicationContext建在类路径下,如果我们把ApplicationContext移到包下,我们就需要配置完成的包路径
在这里插入图片描述

2.2. 容器中的所有对象会在容器被创建时同时创建
我们将对象的创建工作交给了spring,但是spring是什么时候完成这个任务的呢?是我们创建applicationContext对象时,还是我们getBean()的时候呢?
我们可以在User的无参构造器中添加一个打印,来验证一下IOC容器是什么时候创建对象的。
在这里插入图片描述

我们将getBean()方法注释掉,发现对象依旧被创建了,所以我们可以确认容器中的对象会在容器被创建完成时同时创建。
在这里插入图片描述
2.3. 同一个对象在容器是单实例的,只会创建一次
我们可以再创建一个测试类Test2,当我们在两个不同的class中获取容器中同一个对象时,这个对象会创建几次呢?
在这里插入图片描述

package com.hao.spring.user;
import org.springframework.context.ApplicationContext;
public class Test2 {
      public void TestBean(ApplicationContext ac,User user) {
            User user2 = (User)ac.getBean("User");
            System.out.println(user==user2);
      }
}

在Test中调用Test2:
在这里插入图片描述

package com.hao.spring.user;
import org.springframework.context.ApplicationContext;
import 
org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
      public static void main(String[] args) {
            ApplicationContext ac = new 
ClassPathXmlApplicationContext("applicationContext.xml");
            User user = (User)ac.getBean("User");
            Test2 test2 = new Test2();
            test2.TestBean(ac,user);
            //System.out.println(user);
      }
}

比较对象的地址之后我们发现它是同一个,所以同一个对象在容器中只会创建一次。
在这里插入图片描述
2.4.IOC容器在创建对象时会根据我们配置的property属性对javaBean的属性赋值,而property是利用我们JavaBean中的set方法进行的
我们可以在userName的set方法中添加打印进行验证,所以赋值操作并不是spring凭空完成的,而是调用的set方法
在这里插入图片描述
在这里插入图片描述

2.5. property中name的属性值是由set的方法名称决定的(我们需要配置的set方法名称的去掉set然后首字母小写的名字),而不是属性名称
可能是因为赋值需要用到set方法,所以property的name属性需要配置的是set方法名称的去掉set然后首字母小写的名字,而不是属性名称。
我们将userName的set方法名修改成setSerName,使用set名的user成功创建,但是用属性名的user2就创建失败了,所以我们的get/set方法自动生成就好了,而不要随便修改了。
在这里插入图片描述

2.6. 当我们获取一个没有在容器中注册的对象时,spring会抛出NoSuchBeanDefinitionException(未定义Bean异常)异常,获取不存在的属性时会抛出NotWritablePropertyException异常(不可写属性异常)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值