JAVA SSM---Spring01

1.Spring

package Test;

import java.util.Calendar;

import org.junit.Test;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import pojo.aFirstHello;
import pojo.cSingletonUser;
import pojo.dLifeUser;
import pojo.eUserDI;

//进行单元测试类
public class TestSping {
	
	//-------------------------1.sping的IOC入门------------------------------------------
	/*
	 知识点1.1:spring的IOC(控制反转)
	 		IOC:inversion of control 
			IOC:就是讲对象创建的权利交给spring,而程序员无需去关注对象的生命周期。
			
			以前:Person person = new Person();		  //程序员手动编写
			现在:Person person = spring容器.getBean();//spring容器负责对象的创建
 
        步骤:
        a.导入jar包 
        b.编写了Hello的实体类
        c.编写了核心配置文件 : applicationContext.xml 最好命名为该名称
        d.编写了单元测试类:TestSpring
  			> 启动spring容器
 			> 通过spring容器获取bean
 			> 调用Hello对象的say()方法
 			
 			
 	 知识点1.2:spring的IOC的原理
		 第一步:sping容器的创建,加载了配置文件中的信息。
			    1.1 当spring容器启动时,找到了对应的核心配置文件applicationContext.xml
				1.2 当加载配置文件时,逐行的读取xml配置,然后遇到bean标签时,进行解析
		        1.3 bean标签的id属性,解析为map中的key,bean标签的class属性,解析时通过java的反射机制,创建了Hello对象,同时,把value值放入了map中的value中
		
		 第二步:从sping容器中map获取对象 key:
		 		2.1使用map中的id属性的值,获取了map中的对象。
			
			如果根据配置文件解析时出错,那么spring容器将不能正常启动.不能为用户提供服务. 如果容器启动正常 则xml配置一定没错.		
       
         知识点1.3 sping获取map对象
		 				  a.通过id的值
						  b.通过class属性
	 */
	//sping的IOC入门
	@Test
	public void test01(){
		//1.sping容器的创建,加载了配置文件中的信息。
		/*
		   注意1.a:两个相同id的bean出错
		   	     		异常信息: bean标签中的id不能重复
		              	出错位置:在配置文件加载的时候就出错,第一步就出错。
		             配置文件中
		       <bean id="hello" class="pojo.Hello"></bean>
			   <bean id="hello" class="pojo.Hello"></bean>
		  
		 */
		ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
		
		
		
		//2.从sping容器中map获取对象   key:id属性的值,value:创建出来的对象

		//注意:Hello hello=(Hello) context.getBean(Hello.class);       sping获取对象的方式2:class类型,不会报错
		aFirstHello hello=(aFirstHello) context.getBean("hello");   // sping获取对象的方式1:id属性的值
		
		/*
		       注意1.b两个相同class属性的bean
		                 	异常信息: 找不到唯一的class
		                  	出错位置:加载文件时不报错,在map取值时报错了
		                 配置文件
		          <bean id="hello" class="pojo.Hello"></bean>
				  <bean id="helloA" class="pojo.Hello"></bean>
				  测试类中
				  Hello hello=(Hello) context.getBean(Hello.class); 
	
		    在第二步报错,加载文件时报错,在map取值时报错,找不到唯一的class.
		*/	
		
		
		//3.调用hello对象中的方法
		hello.say();
		
	}
	
	
	//别名标签的使用
	/*
	 	配置文件中 
	 	  <bean id="hello" class="pojo.aFirstHello"></bean>
	 	  <alias name="hello"  alias="1806班"></alias>
		 别名标签:alias
		 		 name:引用bean的id的值
		 		 alias:程序员根据自己习惯,定义的名称,避免了重复的bean标签出现
	 */
	@Test
	public void test02(){
		//1.sping容器的创建,加载了配置文件中的信息。
		ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
		
		//2.从sping容器中map获取对象 key:
		aFirstHello hello=(aFirstHello) context.getBean("1806班");         
	
		
		//3.调用hello对象中的方法
		hello.say();
		
		
	}
	
	//-------------------------2.spring容器创建对象的方式-----------------------------------------
	/*
	   有一些类,交给spring容器时去直接创建的时候,没有办法直接new出来。
	  Hello  	new Hello()         	spring可以直接new
	  Calendar  Calender.getInstance()  sping无法直接new
	  
	   知识点2.1
	        a.默认的使用无参构造 创建对象:必须要有无参构造
	   		b.使用静态的工厂类,在工厂类中写一个getXXX的static静态方法
			c.使用非静态的实例工厂类,在工厂类中写一个getXXX的非静态方法
			d.使用spring提供的一个接口  :FactoryBean<Calendar>
			
			
		     建议:以后需要创建对象时,而该对象又不能直接被spring容器管理,那么我们选择spring提供的工厂模式,d.FactoryBean
	 */
	
	
	/*
	 	b静态工厂    
	 	工厂类
	 		 写一个getXXX的static静态方法,返回对象
	 		 public static Calendar getCalendar(){
					return Calendar.getInstance();
			}
	 	
	 	配置文件中
		 	factory-method=""   表示静态工厂中的静态方法
		    <bean id="calendarA" class="pojo.bstaticFactory" factory-method="getCalendar"></bean>
	 */
	@Test
	public void test03(){
		ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
		
		Calendar calendarA=(Calendar) context.getBean("calendarA");
		
		System.out.println(calendarA.getTime());
		
	}
	
	
	
	/*
	   c实例工厂 
		   工厂类
		   		在工厂类中写一个getXXX的非静态方法,返回对象
				public Calendar getCalendar(){
					return Calendar.getInstance();
				}
		 
		  配置文件中
		  		 <bean id="newFactory" class="pojo.bInstanceFactory" ></bean>
	  			 <!-- 获取calendar日历对象  factory-bean=上面的bean标签的id   factory-method表示实例工厂的方法  -->
	  			 <bean id="calendarB" factory-bean="newFactory" factory-method="getCalendar"></bean>
	 */
	@Test
	public void test04(){
		ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
			
		Calendar calendarA=(Calendar) context.getBean("calendarB");
			
		System.out.println(calendarA.getTime());
			
	}
	
	
	/*
	   d使用spring提供的一个接口  :FactoryBean<T>
	         
	         工厂类中实现接口 implements factoryBean<T>
	          implements FactoryBean<Calendar>{
				//获取对象的方法getObject()
				@Override
				public Calendar getObject() throws Exception {
					return Calendar.getInstance();
				}
			    
				//获取对象的类型
				@Override
				public Class<?> getObjectType() {
					return Calendar.class;
				}
			
				//对象是否是单例模式
				@Override
				public boolean isSingleton() {
					return false;
				}
			}
	        
	        配置文件中
	       <bean id="calendarC" class="pojo.bSpingFactory"></bean>
	       
	      建议:以后需要创建对象时,而该对象又不能直接被spring容器管理,那么我们选择spring提供的工厂模式,FactoryBean
	 */
	@Test
	public void test05(){
			ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
					
			Calendar calendarA=(Calendar) context.getBean("calendarC");
				
			System.out.println(calendarA.getTime());
					
	}
		
	
	
	/*
	    a.无参构造,sping默认无参创建对象
	    
	    	配置文件中
	    		<bean id="helloD" class="pojo.aFirstHello"></bean>
	 */
	@Test
	public void test06(){
			ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
			aFirstHello hello=(aFirstHello) context.getBean("helloD");
			hello.say();
						
	}
	
	
	//---------------------3.判断创建的对象是单例还是多例+懒加载-----------------------------------
	/*  
	    ----------------知识点3.1: 在spring容器中,默认创建的对象都是单例的---------------------
	       当applocationContext.xml
	    <bean id="SingletonUser"  class="pojo.cSingletonUser"></bean>  	
		 默认输出结果:
		  			我是无参构造
					pojo.SingleUser@477a1767
					pojo.SingleUser@477a1767
		  
		 结论:
		       因为user地址一样,所以在spring容器中,默认创建的对象都是单例的。(单例:在内存中对象有且只有一份)
			单例优点:节省内存开销
			单例缺点:在一些项目需求中,比如,用户订单模块。订单对象最好是多例,因为单例,对象的内容会更新,看不到之前结果。
		 
		 
		-----------------知识点3.2: 在spring容器中,改变创建的对象是多例的---(多例模式的设计)------------------
		方式:当applocationContext.xml修改scope属性:
					scope="singleton"  默认单例
		    		scope="prototype"  多例,多例默认懒加载
		  <bean id="SingletonUser"  class="pojo.SingletonUser" scope="prototype"></bean>  	
		   
		  输出结果:
				 我是无参构造
				pojo.SingletonUser@2c78bc3b
				我是无参构造					//懒加载的时候,程序员什么时候调用getBean,spring就什么时候生成对象。
				pojo.SingletonUser@2a8ddc4c
		 
		
		知识点3.3
		多例模式下:spring不负责对象的生命周期的维护。也就是说,程序员什么时候调用getBean,spring就什么时候生成对象。
     	单例模式下:spring直接创建出对象,负责对象的生命周期
     	
     	--------------------知识点3.3 懒加载---------------------------------------------------------------
     	  	 知识点3.3:对象的懒加载,lazy-init="true"表示懒加载生效,在spring容器启动时不加载,调用时才加载
	       	 
	       	 
	       	如果所有的bean都在容器启动时创建,这样会操作性能的降低.
			理想:
			什么时候需要,什么时候创建 -懒加载
			lazy-init="true"      //懒加载生效
			lazy-init="false"	  //懒加载不生效
			lazy-init="defalut"	  //默认懒加载配置 根据头标签里面default-lazy-init="true"
			
			
			注意3.1:如果头标签里面default-lazy-init="true",下面的lazy-init不用写,使用全局配置
			
			
			注意3.2:
			Lazy-init与scope一起联用时 
			如果对象是多例的,那么不管lazy-init为啥,统统都是懒加载.
			
			注意3.3:
				懒加载和单例/多例没关系,懒加载不会影响输出结果,懒加载只会在spring容器启动时不加载,调用时才加载,
				其影响的加载时间,我们看不出来,只能再内存中发现。
     	
	
	 */
	@Test
	public void test07(){
			ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
			//获取User对象
			cSingletonUser user1=(cSingletonUser) context.getBean("SingletonUser");
			System.out.println(user1);	
			cSingletonUser user2=(cSingletonUser) context.getBean("SingletonUser");
			System.out.println(user2);
	}
	
	
	
	//---------------------------4.spring创建对象的生命周期---------------------------------------
	/*
	 
	 
	   整个spring中对象的简单生命周期划分为4部分
		1.对象实例化(构造方法)
		2.调用初始化方法
		3.对象完成特定的操作
		4.对象销毁.
		
		对象类,模拟声明周期
		public class dLifeUser {
		   //构造方法
			public dLifeUser(){
				System.out.println("无参构造方法");
			}
	
			//自定义方法:初始化
			public void init(){
				System.out.println("初始化方法");
			}
	
			//自定义方法:方法调用
			public void say(){
				System.out.println("对象的方法调用");
			}
			//自定义方法:销毁
			public void destroy(){
				System.out.println("对象的销毁");
			}
		}
		
		

		
		配置文件中
		init-method="初始化函数" destroy-method="销毁函数"   不用加入构造函数,进行对象实例化
		<bean id="user"  class="pojo.dLifeUser" init-method="init" destroy-method="destroy"></bean>
		
		输出结果:
		
		无参构造方法
		初始化方法
		对象的方法调用
			2018-8-30 15:15:26 org.springframework.context.support.AbstractApplicationContext doClose
			信息: Closing org.springframework.context.support.ClassPathXmlApplicationContext@423e5d1: startup date [Thu Aug 30 15:15:26 CST 2018]; root of context hierarchy
			2018-8-30 15:15:26 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry destroySingletons
			信息: Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@560c3014: defining beans [hello,calendarA,newFactory,calendarB,calendarC,helloD,SingletonUser,user]; root of factory hierarchy
		对象的销毁

	 */
	@Test
	public void test08(){
		   //注意:调用close()方法,必须ApplicationContext改为ClassPathXmlApplicationContext
			ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
			//获取User对象
			dLifeUser user=(dLifeUser) context.getBean("user");
			user.say();
			context.close();  //关闭sping容器时,sping容器负责的对象全部销毁
	}
	
	
	
	//---------------------------5.spring的DI(依赖注入)Dependcy Injection -------------------------------------
	/*  
	        知识点5:依赖注入:
		   		依赖:谁依赖谁? 		  user对象的创建,依赖于成员变量。
				注入:把谁注入到谁中?  把成员变量的值注入到user对象中
				
				DI的第一种依赖注入的方式:set方式
				set方式的原理:根据 setXXX()方法中的,XXX名称来判断的。
							    1.在bean标签中 
							       <bean id="name"  class="pojo.eUserDI">
							       		<property name="name1" value="张三丰"></property>
							       </bean>
							    2.spring进行解析时,找name属性,取出其中的值"name1",然后根据eUserDI类中的setName()方法去匹配
							     	
							     	***注意:匹配的规则:把set去掉,然后Name变为小写name。****
							     	
							    3.name1  与  name 匹配,没有成功,所有注入失败
							    
				注意:set方式注入,必须要有 对应的 set方法才能够正常的注入
					  匹配的规则:把set去掉,然后Name变为小写name。
	 */
	@Test
	public void test09(){
			ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
			//获取User对象
			eUserDI user=(eUserDI) context.getBean("UserDI");
			System.out.println(user);
	}
}
<?xml version="1.0" encoding="UTF-8"?>
<!-- 头文件
	xmlns:	  xml的命名空间\beans
	xmlns:xsi:遵循xml的规范
	xsi:schemaLocation:xml书写的语法格式
	
 -->
<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-3.2.xsd"
	default-lazy-init="true">  
	<!-- default-lazy-init="true"全局默认懒加载配置 -->
	
<!-- ************************1.sping的IOC入门***************************    -->	
	<!-- bean表示sping管理的实体类 
	     id:表示bean标签的唯一标识,不能重复,id的格式:类名首字母小写 
	     class:实体类所在路径,class格式:包名.类名
	 -->
	<bean id="hello" class="pojo.aFirstHello"></bean>    <!-- 可以使用alt+/ 快速的定位类-->
	
	<!-- bean标签在重复出现情况下,会报错,比如,项目整合阶段
		 别名标签:alias
		 name:引用bean的id的值
		 alias:程序员根据自己习惯,定义的名称,避免了重复的bean标签出现
	 -->
	 <alias name="hello"  alias="1806班"></alias>
	 
	 
<!-- ************************2.spring容器创建对象的方式**************************    -->		
  
	 
	 <!-- 2.2静态工厂
	 		factory-method="" 表示  静态工厂中的静态方法
	  -->
	 <bean id="calendarA" class="pojo.bstaticFactory" factory-method="getCalendar"></bean>
	 
	 
	 <!-- 2.3实例工厂
	 -->
	  <bean id="newFactory" class="pojo.bInstanceFactory" ></bean>
	  <!-- 获取calendar日历对象  factory-bean=上面的bean标签的id   factory-method表示实例工厂的方法  -->
	  <bean id="calendarB" factory-bean="newFactory" factory-method="getCalendar"></bean>
	  
	  <!-- 
	  	 2.4sping提供的FactoryBean
	   -->
	   <bean id="calendarC" class="pojo.bSpingFactory"></bean>
	   
	   
	   <!-- 
	      	2.1默认无参构造
	    -->
	    <bean id="helloD" class="pojo.aFirstHello"></bean>
	    
	    
	    
<!-- **********************3.判断创建的对象是单例还是多例+懒加载**************************    -->			    
	   
	    
	    <!-- 知识点3.3:
	    		创建的对象是否是多例还是单例,默认是单例
	    		scope="singleton"  默认单例
	    		scope="prototype"  多例,懒加载,什么时候需要,什么时候创建
	     -->
	     
	     
	     
	     <!-- 
	       	 知识点3.2:对象的懒加载,lazy-init="true"表示懒加载生效,在spring容器启动时不加载,调用时才加载
	       	 
	       	 
	       	如果所有的bean都在容器启动时创建,这样会操作性能的降低.
			理想:
			什么时候需要,什么时候创建 -懒加载
			lazy-init="true"      //懒加载生效
			lazy-init="false"	  //懒加载不生效
			lazy-init="defalut"	  //默认懒加载配置 根据头标签里面default-lazy-init="true"
			
			
			注意3.1:如果头标签里面default-lazy-init="true",下面的lazy-init不用写,使用全局配置
			
			
			注意3.2:
			Lazy-init与scope一起联用时 
			如果对象是多例的,那么不管lazy-init为啥,统统都是懒加载.
			
			注意3.3:
			懒加载和单例/多例没关系,懒加载不会影响输出结果,懒加载只会在spring容器启动时不加载,调用时才加载,
			其影响的加载时间,我们看不出来,只能再内存中发现。
			
	      -->
	    <bean id="SingletonUser"  class="pojo.cSingletonUser" scope="prototype" lazy-init="false" ></bean>
	    
	
	
	
	
	    
<!-- **********************4.spring创建对象的生命周期**************************    -->		    
	      
	      
	    <!-- 对象的生命周期  初始化和销毁操作
	    	  init-method="初始化函数" destroy-method="销毁函数"   不用加入构造函数,进行对象实例化
	    -->
	    <bean id="user"  class="pojo.dLifeUser" init-method="init" destroy-method="destroy"></bean>
	    
	    
	    
	    
<!-- **********************5.spring的DI(依赖注入)Dependcy Injection************************** -->    
	    
	    <!-- 依赖注入DI set方式的注入  
	     -->
	    <bean id="UserDI" class="pojo.eUserDI">
	        <!-- property标签:表示 描类的各个属性
	        	 name="" : 表示  属性名
				 value="" :表示   属性值
				 spring在依赖注入时:自动识别简单的数据类型,如int age 这里value写value="20"而不是value=20
	         -->
	        
	        <!-- 1简单类型 -->
	    	<property name="name" value="张三丰"></property>
	    	<property name="age" value="20"></property>
	    	
	    	
	    	<!-- 2复杂类型 -->
	    	
	    	<!-- 2.1 list类型在spring中,默认是ArrayList类型的,arraylist是按数组下标存的 -->
	    	<property name="list">
	    		<list>
	    			<value>1</value>
	    			<value>2</value>
	    			<value>3</value>
	    		</list>
	    	</property>
	    	
	    	<!-- 2.2 map类型 -->
	    	<property name="map">
	    		<map>
	    			<entry key="xx" value="西溪"></entry>
	    			<entry key="hz" value="杭州"></entry>
	    		</map>
	    	</property>
	    	
	    	<!-- 2.3 set类型 -->
	    	<property name="set">
	    		<set>
	    			<value>1</value>
	    			<value>1</value>      <!-- set中元素不可重复,这里只显示一个1 -->
	    		</set>
	    	</property>
	    	
	    	<!-- 2.4数组[]  list默认是arraylist,arraylist是按数组下标存的,所以可以用list -->
	    	<property name="arr">
	    		<list>
	    			<value>1</value>
	    			<value>2</value>
	    			<value>3</value>
	    		</list>
	    	</property>
	    	
	    	<!-- 2.5 Properties类型 -->
	    	<property name="prop">
	    		<props>
	    			<prop key="szh">SHENZHIHENG</prop>
	    			<prop key="szh">sp</prop>    <!-- Properties中元素会覆盖,相同key,取后面赋值的值即sp -->
	    			<prop key="WUYUN">wuyun</prop>
	    		</props>
	    	</property>
	    	
	    	<!-- 3.引用类型
	    	     	ref=""引用其他的bean标签,值是bean标签中的
	    	 -->
	    	<property name="dog" ref="dog"></property>   	<!-- 第二步:然后把dog对象注入到User对象中 -->
	    </bean>
	    
	    
	    <!-- 描述dog类的对象 ,第一步:Dog类中进行依赖注入,第二步:然后把dog对象注入到User对象中-->
	    <bean id="dog" class="pojo.eDogRefDI">
	    	<property name="dogName" value="阿旺"></property>   <!-- 第一步:Dog类中进行依赖注入 -->
	    	<property name="dogAge" value="12"></property>
	    </bean>
</beans>

package pojo;

//编写实体类
public class aFirstHello {
	//自定义方法
	public void say(){
		System.out.println("hello spring");
	}
	
	
	/*
	//无参构造
	public aFirstHello(){
		System.out.println("我是无参构造创建对象");
	}
	//该方法中出现有参构造,则出错 
	*/
}
package pojo;

import java.util.Calendar;
//静态工厂
public class bstaticFactory {
	//自定义方法,静态static修饰
	public static Calendar getCalendar(){
		return Calendar.getInstance();
	}
}
package pojo;

import java.util.Calendar;

//实例工厂
public class bInstanceFactory {
	//自定义方法:不使用static
	public Calendar getCalendar(){
		return Calendar.getInstance();
	}
}
package pojo;

import java.util.Calendar;

import org.springframework.beans.factory.FactoryBean;


//sping提供的 implements FactoryBean<T>
public class bSpingFactory implements FactoryBean<Calendar>{
	
	//获取对象的方法getObject()
	@Override
	public Calendar getObject() throws Exception {
		return Calendar.getInstance();
	}
    
	//获取对象的类型
	@Override
	public Class<?> getObjectType() {
		return Calendar.class;
	}

	//对象是否是单例模式
	@Override
	public boolean isSingleton() {
	
		return false;
	}

}
package pojo;

//测试构造的对象是多例还是单例
public class cSingletonUser {
	
	public cSingletonUser(){
		System.out.println("我是无参构造");
	}
}
package pojo;

//模拟声明周期
public class dLifeUser {
	//构造方法
	public dLifeUser(){
		System.out.println("无参构造方法");
	}
	
	//自定义方法:初始化
	public void init(){
		System.out.println("初始化方法");
	}
	
	//自定义方法:方法调用
	public void say(){
		System.out.println("对象的方法调用");
	}
	//自定义方法:销毁
	public void destroy(){
		System.out.println("对象的销毁");
	}
}
package pojo;

public class eDogRefDI {
	private String dogName;
	 private int   dogAge;
	public synchronized String getDogName() {
		return dogName;
	}
	public synchronized void setDogName(String dogName) {
		this.dogName = dogName;
	}
	public synchronized int getDogAge() {
		return dogAge;
	}
	public synchronized void setDogAge(int dogAge) {
		this.dogAge = dogAge;
	}
	
	@Override
	public String toString() {
		return "eDogRefDI [dogName=" + dogName + ", dogAge=" + dogAge + "]";
	}
	 
}
package pojo;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;

//sping的依赖注入DI

/*
 	依赖:谁依赖谁? 		  user对象的创建,依赖于成员变量。
	注入:把谁注入到谁中?  把成员变量的值注入到user对象中
	
	依赖注入的方式:
	1.set方法注入  必须要有set方法
	2.构造方法注入 
	
 */
public class eUserDI {
	//1.简单类型
	private String name;
	private int age;
	
	//2.复杂类型
	private List list;
	private Map map;
	private Set set;
	private String[] arr;
	private Properties prop;
	
	//3.引用类型
	private eDogRefDI dog;
	
	
	public synchronized eDogRefDI getDog() {
		return dog;
	}
	public synchronized void setDog(eDogRefDI dog) {
		this.dog = dog;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {    //如果setName1 name="name1",set方法是根据setXXX方法中,<property name="xxx" ></property>xxx来名称来判断的
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
	
	
	
	public synchronized Map getMap() {
		return map;
	}
	public synchronized void setMap(Map map) {
		this.map = map;
	}
	public synchronized Set getSet() {
		return set;
	}
	public synchronized void setSet(Set set) {
		this.set = set;
	}
	public synchronized String[] getArr() {
		return arr;
	}
	public synchronized void setArr(String[] arr) {
		this.arr = arr;
	}
	public synchronized Properties getProp() {
		return prop;
	}
	public synchronized void setProp(Properties prop) {
		this.prop = prop;
	}
	public List getList() {
		return list;
	}
	public void setList(List list) {
		this.list = list;
	}
	@Override
	public String toString() {
		return "UserDI [name=" + name + ", age=" + age + ", list=" + list
				+ ", map=" + map + ", set=" + set + ", arr="
				+ Arrays.toString(arr) + ", prop=" + prop + ", dog=" + dog
				+ "]";
	}
	
	
	
}

2.Spring分层模拟 mvc

2.1Servlet

package web;

import pojo.User;
import service.UserService;


//模拟controller层 控制层
public class UserServlet {
	
	//Servlet依赖Service,所以需要使用service对象,接口即可
	private UserService userService;

	//必须提供service的set方法,因为set方式注入DI,必须要有对应的set方法才能够正常的注入
	public void setUserService(UserService userService) {
		this.userService = userService;
	}
	
	
	
	public void addUser(User user){  //添加用户
		userService.addUser(user);
	}
	
	
	
}

2.2Service

package service;

import pojo.User;

//Service接口
public interface UserService {
	//添加用户
	public void addUser(User user);
}
package service;

import dao.UserDao;
import pojo.User;

//Service的实现类
public class UserServiceImpl implements UserService {

		//service依赖于dao,所以使用dao对象,接口即可
		private UserDao userDao;
         
		//必须提供service的set方法,因为set方式注入DI,必须要有对应的set方法才能够正常的注入
		public void setUserDao(UserDao userDao) {
			this.userDao = userDao;
		}

		@Override
		public void addUser(User user) {   //添加用户
			userDao.addUser(user);
		}
}

2.3Dao

package dao;

import pojo.User;

//Dao接口
public interface UserDao {
	public void addUser(User user);
}
package dao;

import pojo.User;

//Dao接口实现类
public class UserDaoImpl implements UserDao{

	@Override
	public void addUser(User user) {      //最终操作数据库,实现增加用户的方法
		// TODO Auto-generated method stub
		System.out.println("新增一个用户:"+user);
	}

}

2.4Pojo

package pojo;

public class User {
	private String name;
	private int age;
	
	
	/*
	 	User类中默认无参构造
	       配置文件中
		     <!-- 依赖注入DI  把成员变量的值注入到对象中-->
			<bean id="user" class="pojo.User">
				  <property name="name" value="szh"></property>    <!-- 简单类型的注入: 把成员变量的值注入到对象中 -->
				  <property name="age" value="20"></property>
			</bean>
	 */
	
	/*
	   User类中有参构造方法
	     配置文件中
		    <!-- 有参构造方法注入,和 <constructor-arg>标签 配套 
				 index=有参构造方法第几个参数
				 name=set方法,去set,第一个字母小写
				 value=对应属性的值
			-->
			<constructor-arg index="0" name="name" value="hehe"></constructor-arg>
			<constructor-arg index="1" name="age" value="10"></constructor-arg>
	  
	 */
	
	public User(String name,int age) {
			this.age = age;
			this.name = name;
	}
	
	@Override
	public String toString() {
		return "User [name=" + name + ", age=" + age + "]";
	}
	public synchronized String getName() {
		return name;
	}
	public synchronized void setName(String name) {
		this.name = name;
	}
	public synchronized int getAge() {
		return age;
	}
	public synchronized void setAge(int age) {
		this.age = age;
	}
}

 

2.5配置文件applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- 头文件
	xmlns:	  xml的命名空间\beans
	xmlns:xsi:遵循xml的规范
	xsi:schemaLocation:xml书写的语法格式
	
 -->
<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-3.2.xsd"
	>  
	
	<!-- 依赖注入DI  把成员变量的值注入到对象中-->
	<bean id="user" class="pojo.User">
	
	   <!--1.1无参构造方法注入,和<property>标签配套
	      <property name="name" value="szh"></property>    简单类型的注入: 把成员变量的值注入到对象中 
	      <property name="age" value="20"></property> 
	   -->
	   
		<!--1.2有参构造方法注入,和 <constructor-arg>标签 配套 
			 index=有参构造方法第几个参数
			 name=set方法,去set,第一个字母小写
			 value=对应属性的值
		-->
		<constructor-arg index="0" name="name" value="hehe"></constructor-arg>
		<constructor-arg index="1" name="age" value="10"></constructor-arg>
	  
	</bean>
	
	
	<bean id="userDao" class="dao.UserDaoImpl"> </bean>  <!--  bean表示sping管理的实体类  -->
	
	<bean id="userService" class="service.UserServiceImpl">
			<property name="userDao" ref="userDao"></property>  	<!-- 引用类型的注入:(引用类型:类中还有其他类对象) userServiceImpl类中有userDao接口对象
																	      name	set方法,即service.UserServiceImpl的setUserDao()方法中,去set,第一个字母小写
																		  ref	引用其他的bean标签的id,即<bean id="userDao"><bean> -->
	</bean>
	
	<bean id="userServlet" class="web.UserServlet">
		<property name="userService" ref="userService"></property>	 <!-- 引用类型的注入:(引用类型:类中还有其他类对象) userServlet类中有userService接口对象
																	      name	set方法的注入,即service.UserServlet的setUserService()方法中,去set,第一个字母小写
																		  ref	引用其他的bean标签的id,即<bean id="userService"><bean> -->
	</bean>
</beans>

2.6测试类

package Test;

import java.util.Calendar;

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

import pojo.User;


import web.UserServlet;

//进行单元测试类
public class TestSping {
	@Test
	public void test01(){
		ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
		
		 //客户端Servlet
		 UserServlet userServlet=(UserServlet) context.getBean("userServlet");       
		 
		 
		 //获取用户对象
		 User user=(User) context.getBean("user");
		 //添加一个用户
		 userServlet.addUser(user);
		
	}
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值