spring框架,springIOC入门,配置文件详解,三种bean的创建方法

 IOC: 控制反转 
                  思想大白话: 把创建对象的权利交给spring了
                  底层技术支持: 工厂+反射+配置文件 (spring都封装好了)
                  解决的问题: 解耦合
            spring的环境搭建:
                    1 导包:  
                        beans core context expression

                        spring在运行的过程中 会加载一个日志包 
                        commons-logging.jar  提供了日志功能 但是企业不用它记录日志

                        apache--log4j.jar   企业开发用的最多的是它记录日志
                                    log4j.properties

                        spring在加载的过程中会加载commons-logging.jar日志包
                        commons-logging.jar日志包的内部会看有没有apache--log4j.jar包
                        如果有 就是用commons-log4j.jar功能来记录日志
                        如果没有 就使用自己的 

              

                    
                    2 创建一个类 

package com.it.bean;

public class User {
	// 构造器
		public User()
		{
			System.out.println("我被创建了...");
		}
		
		public void run()
		{
			System.out.println("跑~~~~~");
		}
		
		// 指定一个方法为初始化方法
		public void init()
		{
			System.out.println("我要初始化了...");
		}
		// 指定一个方法为销毁方法
		public void destory()
		{
			System.out.println("我挂了..66666666");
		}
}


                    3 在src下面有一个配置文件 建议用: applicationContext.xml
                            所有约束都抽出来放在一个html文件中
                            /spring-framework-4.2.4.RELEASE/docs/spring-framework-reference/html/xsd-configuration.html

                 

   4 测试

//自己new对象
	@Test
	public void t1() {
		User user=new User();
		user.run();
	}
	//spring ioc 来创建对象
	@Test
	public void t2() {
		// 加载配置文件,ClassPathXmlApplicationContext("xml配置文件的名字")
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
		//向spring要对象,getBean("xml配置文件bean标签里面的id的值")
		User user = (User) context.getBean("user");
		user.run();
	}
<?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">
<!-- 
	
		1: 基本配置
			bean标签: 指定要创建的实体类
				id属性: 可以为任意值  但是在整个配置文件中唯一
				class属性: 要实例化类的全限定名 反射 
	 -->
   <bean id="user" class="com.it.bean.User"></bean> 

二: ioc的配置文件内容

 bean标签: 指定要实例化的对象
                   id属性: 唯一标识 可以为任意值 但是整个xml唯一
                   class属性: 类的全限定名 就是通过它反射该类的实例对象
                   scope属性: 范围
                    重点:
 singleton: 单实例 默认值
                         配置文件只要一加载 就会创建该实例对象 放在spring容器中 (Map<user,实例对象>)
                         注意:只创建一次
                         当每个人过来要的时候(getBean("user")) 从spring容器中获取的都是同一个实例对象
      

2: scope属性: 范围
			    singleton: 单实例 默认值
			    	 如果是单实例,配置文件文件只要一加载  就会创建对象 放在spring容器 (map<id,对象>)
			    	当所有人过来问spring容器要的时候(getBean),所用人用的都是同一个对象
		<bean id="user" class="com.it.bean.User" scope="singleton"></bean>

             

//测试bean标签里面的scope属性--singleton
	@Test
	public void t3() {
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
		System.out.println("测试scope属性 --singleton");
		User user = (User) context.getBean("user");
		User user1 = (User) context.getBean("user");
		System.out.println(user);
		System.out.println(user1);
	}


 prototype: 多实例
   配置文件只要一加载 不创建该实例对象 
   当所有人过来要的时候(getBean("user")) 才创建该实例对象 放在spring容器中
   注意:获取一次 创建一次 放在spring容器中

  prototype: 多实例
				         如果是多实例,配置文件加载,不创建对象
				         当每个人过来getbean的时候,getbean一次创建一次 放在容器中
		<bean id="user" class="com.it.bean.User" scope="prototype"></bean>
		
@Test // 测试scope属性 --prototype
	public void t4() {
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
		System.out.println("测试scope属性 --prototype");
		User user = (User) context.getBean("user");
		User user1 = (User) context.getBean("user");
		System.out.println(user);
		System.out.println(user1);
	}
	


问:什么时候用默认值singleton(单实例)? 什么时候用prototype(多实例)?
        action: prototype
        service/dao: singleton             
  
init-method属性: 指定初始化的方法
destory-method属性:指定销毁的方法

      singleton:
                      初始化:配置文件加载的时候 创建对象并且初始化
                      销毁:容器销毁 对象跟着销毁
                  
      prototype:
                     初始化:当getbean()的时候  创建对象并且初始化
                        销毁: 长时间不用 java垃圾回收自动回收

singleton的对象什么时候销毁? prototype创建出来的对象什么时候销毁?
			singleton的对象当spring容器关闭 对象销毁
			prototype的对象 长时间不用自动被垃圾回收机制给回收了
			
		init-method:指定初始化方法
		destory-method:指定销毁方法	
<bean id="user" class="com.it.bean.User" scope="singleton" init-method="init" destroy-method="destory"></bean>
<bean id="user" class="com.it.bean.User" scope="prototype" init-method="init" destroy-method="destory"></bean>

   

 // 测试scope属性(singleton)---初始化时机和销毁时机
	  // 初始化: 当对象被创建出来就执行初始化方法  配置文件一加载
	  // 销毁: 容器关闭 对象销毁
	@Test 
	public void t5() {
		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
		System.out.println("测试(singleton)---初始化时机和销毁时机");
		User user = (User) context.getBean("user");
		User user1 = (User) context.getBean("user");
		System.out.println(user);
		System.out.println(user1);
		//关闭容器
		context.close();
	}
	  // 测试scope属性(prototype)---初始化时机和销毁时机
	  // 初始化: 当对象被创建出来就执行初始化方法 getbean的时候
	  // 销毁: 长时间不用 被垃圾回收机制销毁
	@Test 
	public void t6() {
		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
		System.out.println("测试(prototype)---初始化时机和销毁时机");
		User user = (User) context.getBean("user");
		User user1 = (User) context.getBean("user");
		System.out.println(user);
		System.out.println(user1);
		//关闭容器
		context.close();
	}
	

 singleton的创建和销毁:

prototype创建和销毁:

  import标签:导入外部的配置文件
      resource属性:外部配置文件的地址

4 import:导入外部的配置文件
   		 	    resource:外部配置文件的地址
   			web: 所有在web层创建的对象   applicationContext_web.xml
   			service:所有在service层创建的对象   applicationContext_service.xml
   			dao:所有在dao层创建的对象   applicationContext_dao.xml
   			
   			<import resource="applicationContext_web.xml"/>
   			<import resource="applicationContext_service.xml"/>
   			<import resource="applicationContext_dao.xml"/>	
   			
   			测试用的创建了一个applicationContext_user.xml文件
   			<import resource="applicationContext_user.xml"/> 


            
 三、bean的三种创建方式
            无参构造方式
            静态工厂方式(了解)
            实例工厂方式(了解)

无参构造方式

无参构造方式 
   	  	<bean id="user" class="com.it.bean.User"></bean>
@Test // 测试bean的三种创建方式--无参构造器
	public void t7() {
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
		User user =(User) context.getBean("user");
		user.run();
	}

静态工厂方式(了解):条件:需要先有个工厂

工厂类

package com.it.utils;

import com.it.bean.User;

public class BeanFactory {
	// 静态方法---静态工厂
	public static User createUser() {
		return new User();
	}

}

xml配置

<bean id="user" class="com.it.utils.BeanFactory" factory-method="createUser"></bean>
@Test // 测试bean的三种创建方式--静态工厂方式
	public void t8() {
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
		System.out.println("静态工厂方式");
		User user =(User) context.getBean("user");
		User user1 =(User) context.getBean("user");
		System.out.println(user);
		System.out.println(user1);
	}

实例工厂方式(了解)

工厂类

package com.it.utils;

import com.it.bean.User;

public class BeanFactory {
	
	// 普通方法---实例工厂
	public User createUser() {
		return new User();
	}
}

xml

 <!-- 实例工厂(了解) 
   	  		  条件:需要有一个工厂类 在这个工厂类中还需要有一个普通方法
   	   -->
   	   <bean id="beanFactory" class="com.it.utils.BeanFactory"></bean>
   	   <bean id="user" factory-bean="beanFactory" factory-method="createUser"></bean>

java测试代码

	@Test // 测试bean的三种创建方式--实例工厂方式
	public void t9()
	{
		ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
		System.out.println("实例工厂方式测试...");
		User user=(User)context.getBean("user");
		User user2=(User)context.getBean("user");
		System.out.println(user);
		System.out.println(user2);
	}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Exception.

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

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

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

打赏作者

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

抵扣说明:

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

余额充值