Java必会框架—SpringIOC(二十个小实验必拿下)!!!

Java必会框架—SpringIOC(二十个小实验必拿下)!!!

1、对ioc的认识

IOC:(Inversion(反转) Of Control):控制反转;

控制:资源的获取方式(主动式和被动式)。

主动式:要什么资源都得自己创建。

 BookServlet{
 			BookService bs = new BookService();
 			//复杂对象的创建是比较庞大的工程;
 			AirPlane ap = new AirPlane(); 
            }

被动式:资源的获取不需要我们自己创建,而是交给一个第三者(容器)来帮为我们创建和设置。

 BookServlet{
             BookService bs;
             
             public void test01(){
             		bs.checkout();
                                 }
             }
	第三者——(容器):管理所有的组件(有功能的类);假设,BookServlet受容器管理,BookService也受容器管理;
	容器可以自动的探查出那些组件(类)。如果需要用到另一组件(类),容器会帮我们创建BookService对象,
	并把BookService对象赋值过去。**容器会我们将原来需要主动new的资源变为被动的接受资源。**
	
	容器相当于一个婚介所,使原本需要我们自己主动找合适的mm,变成帮我们找,我们只需要提供我们对mm的要求就行,它会(容器)帮我们符合我们要求的mm。主动获取变为被动接受。

DI:(Dependency Injection)依赖注入;
容器能知道哪个组件(类)运行的时候,需要另外一个类(组件);容器通过反射的形式,将容器中准备好的BookService对象注入(利用反射给属性赋值)到BookServlet中。只要是被IOC容器管理的组件,都能使用容器提供的强大功能;

2、使用ioc操作,通过各种方式给容器中注册对象(注册成为婚介所的会员)

实验一:通过IOC容器创建对象,并为属性赋值★

1)、导包

//核心容器
spring-beans-4.0.0.RELEASE.jar
spring-context-4.0.0.RELEASE.jar
spring-core-4.0.0.RELEASE.jar
spring-expression-4.0.0.RELEASE.jar
commons-logging-1.1.3.jar
//Spring运行的时候依赖一个日志包;没有就报错;

2)、写配置
spring的配置文件中,集合了spring的ioc容器管理的所有组件(会员清单),创建一个Spring Bean Configuration File(Spring的bean配置文件)。

例如:注册一个Person对象,Spring会自动创建这个Person对象。

<!-- 注册一个Person对象,Spring会自动创建这个Person对象 -->
    <!--
    一个Bean标签可以注册一个组件(对象、类)
    class:写要注册的组件的全类名
    id:这个对象的唯一标示;
    -->
    <bean id="person01" class="com.zxy.bean.Person">
        <!--使用property标签为Person对象的属性赋值
        	property利用setter方法为javaBean的属性进行赋值(必须为Person添加getter,setter方法,否则报错)
            name="lastName":指定属性名
            value="张三":为这个属性赋值
        -->
        <property name="Name" value="张三"></property>
        <property name="age" value="18"></property>
        <property name="gender" value="男"></property>
    </bean>

配置对象注册成功标志(出现S符号标识)
在这里插入图片描述

3)、测试
几个细节:
1、ApplicationContext(IOC容器的接口)
2、给容器中注册一个组件;我们也从容器中按照id拿到了这个组件的对象?
组件的创建工作,是容器完成;
Person对象是什么时候创建好了呢?
容器中对象的创建在容器创建完成的时候就已经创建好了;
3、同一个组件在ioc容器中是单实例的;容器启动完成都已经创建准备好的;
4、容器中如果没有这个组件,获取组件?报异常,异常信息如下:

org.springframework.beans.factory.NoSuchBeanDefinitionException:No bean named 'person03' is defined

5、ioc容器在创建这个组件对象的时候,(property)会利用setter方法为javaBean的属性进行赋值;
6、javaBean的属性名是由什么决定的?getter/setter方法是属性名;set去掉后面那一串首字母小写就是属性名;
private String name;?
所有getter/setter都自动生成!

实验2:根据bean的类型从IOC容器中获取bean的实例★

package com.zxy.test;
import static org.junit.Assert.*;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.atguigu.bean.Person;
public class IOCTest {
	/**
     * 存在的几个问题;
     * 1)、src,源码包开始的路径,称为类路径的开始;
     *      所有源码包里面的东西都会被合并放在类路径里面;
     *      java:/bin/
     *      web:/WEB-INF/classes/
     * 2)、导包commons-logging-1.1.3.jar(依赖)
     * 3)、先导包再创建配置文件;
     * 4)、Spring的容器接管了标志了s的类;
     */
   
    @Test
    public void test() {
        //ApplicationContext:代表ioc容器
        //ClassPathXmlApplicationContext:当前应用的xml配置文件在 ClassPath下
        //根据spring的配置文件得到ioc容器对象
        //ClassPathXmlApplicationContext("文件名");
        ApplicationContext ioc = new ClassPathXmlApplicationContext("ioc.xml");
        
        //拿到容器帮我们创建好的对象
        //通过id标识获取配置的对象
        Person bean = (Person) ioc.getBean("person01");
        //通过容器中的对象类型获取(此类型对象必须唯一,若不唯一,则报错)
        //Person bean2 = (Person) ioc.getBean(Person.class);
       	System.out.println(bean.getName()+"-"+bean.getAge()+"-"+bean.getGender()); 
    }
}

在这里插入图片描述
new ClassPathXMlApplicationContext(“ioc.xml”):ioc容器的配置文件在类路径下;
FileSystemXmlApplicationContext(“F://ioc.xml”):oc容器的配置文件在磁盘路径下;

运行效果截图:
在这里插入图片描述

实验3-1:通过构造器为bean的属性赋值(index,type属性介绍)

1)、写配置

<bean id="person02" class="com.zxy.bean.Person">
		<!-- 调用有参构造器进行创建对象并赋值;掌握 -->
		<!-- public Person(String lastName, Integer age, String gender, String email) -->
		<constructor-arg name="name" value="小明"></constructor-arg>
		<constructor-arg name="gender" value="女"></constructor-arg>
		<constructor-arg name="age" value="20"></constructor-arg>
	</bean>
	
	<!--可以省略name属性,严格按照构造器参数的位置  -->
	<bean id="person03" class="com.zxy.bean.Person">
		<constructor-arg value="小花"></constructor-arg>
		<constructor-arg value="18"></constructor-arg>
		<!--  index="3":为参数指定索引,从0开始 -->
		<constructor-arg value="男" index="2"></constructor-arg>
	</bean>
	
	<!--public Person(String name, integer age)  -->
	
	<!-- 重载的情况下type可以指定参数的类型 -->
	<bean id="person04" class="com.zxy.bean.Person">
		<constructor-arg value="小丽"></constructor-arg>
		<constructor-arg value="10" index="1" type="java.lang.Integer"></constructor-arg>
	</bean>
	
	<!--public Person(String name, String gender)  -->
	<bean id="person05" class="com.zxy.bean.Person">
		<constructor-arg value="小丽"></constructor-arg>
		<constructor-arg value="男"></constructor-arg>
	</bean>

2)、获取容器中通过构造器配置赋值的bean

package com.zxy.test;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.zxy.bean.Person;

public class IOCTest {

	ApplicationContext ioc=new ClassPathXmlApplicationContext("ioc.xml");
	
	@Test
	public void test() {
		Person bean = (Person) ioc.getBean("person01");
		System.out.println("通过getter/setter赋值的bean");
		System.out.println(bean.getName()+"-"+bean.getAge()+"-"+bean.getGender());
		
		Person bean2 = (Person) ioc.getBean("person02");
		System.out.println("通过有参构造器赋值的bean");
		System.out.println(bean2.getName()+"-"+bean2.getAge()+"-"+bean2.getGender());
		
		Person bean3 = (Person) ioc.getBean("person03");
		System.out.println("通过有参构造器,省略name属性,赋值顺序严格按照构造器参数的位置,并使用index为参数指定索引,赋值的bean");
		System.out.println(bean3.getName()+"-"+bean3.getAge()+"-"+bean3.getGender());
		
		Person bean4 = (Person) ioc.getBean("person04");
		System.out.println("通过有参构造器的重载的情况下为参数赋值的bean");
		System.out.println("构造器参数:public Person(String name, integer age)");
		//此时获取的bean的Gerder属性的值就为空值
		System.out.println(bean4.getName()+"-"+bean4.getAge()+"-"+bean4.getGender());
		
		Person bean5 = (Person) ioc.getBean("person05");
		System.out.println("通过有参构造器的重载的情况下为参数赋值的bean");
		System.out.println("构造器参数:public Person(String name, String gender)");
		//此时获取的bean的Age属性的值就为空值
		System.out.println(bean5.getName()+"-"+bean5.getAge()+"-"+bean5.getGender());
	}

}

运行效果截图:
在这里插入图片描述

实验3-2、通过p名称空间为bean赋值

1)、写配置

<!-- 通过p名称空间为bean赋值;导入p名称空间 -->
	<!--名称空间:在xml中名称空间是用来防止标签重复的  -->
	<!--步骤:
		1)、导入p名称空间(xml文件的Namespace窗口中导入)
		2)、写带前缀的标签/属性 
	-->
	
	  <bean id="person06" class="com.zxy.bean.Person"
	  p:name="哈哈" p:age="18"  p:gender="男">
	  </bean>

2)、获取容器中通过p名称空间赋值的bean

package com.zxy.test;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.zxy.bean.Person;

public class IOCTest {

	ApplicationContext ioc=new ClassPathXmlApplicationContext("ioc.xml");
	
	@Test
	public void test() {
		Person bean6 = (Person) ioc.getBean("person06");
		System.out.println("通过p名称空间赋值的bean:");
		System.out.println(bean6.getName()+"-"+bean6.getAge()+"-"+bean6.getGender());
	}
}

运行效果截图:
在这里插入图片描述
此次学习情况汇报完毕!(师承:B站:v若水若水——雷丰杨)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值