Spring(一:IOC)

Spring是一个开源的轻量级控制反转(IOC)和面向切面编程(AOP)的容器框架;

底层原理:xml+dom4j+工厂设计模式+反射

====================================================================

IOC:Inverse of control,是一种思想,将对象的控制权(对象创建,销毁的过程)和依赖关系维护(字段赋值)交给Spring容器;
在系统运行中,动态的向某个对象提供它所需要的其他对象;
白话就是以前创建对象,是用到的时候自己new出来的,而使用spring之后,它来完成对象的创建,我们需要用的时候直接注入(DI)即可。

DI:Dependency Injection,依赖注入,就是对IOC的实现。
作用就是给Spring中对象的属性字段赋值

===================================================================

Spring容器的实例化:就是配置文件中配置<bean>------加载配置文件------获取实例
P.s:配置文件在resource下,推荐名:applicationContext.xml

步骤1、实体类

/**
 * 这个类中必需有一个公共无参的构造器
 *	因为Spring用了反射机制,是通过这个无参构造来创建对象的
 */
public class HelloBean {

	public HelloBean(){
		System.out.println("我被创建了....");
	}
}

2、配置配置文件

<?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">
 <!-- 
 	Spring要帮我们创建对象,我们把创建的对象都叫做bean
 	写配置告诉Spring,去帮咱们创建哪一个对象
 	bean:配置一个bean对象
 		id:这个bean的唯一名称,可以随便写
 		class:要配置的对象的类型(必需是全限定名)
 			  Spring是通过反射去创建这个对象的
 			  
 	这里配置了Bean,就是Spring会帮我们创建好对应的对象,相当于HelloBean helloBean = new HelloBean();
  -->
  <bean id="helloBean" class="cn.itsource._01_hello.HelloBean"></bean>
 
</beans>

3、通过实例容器(有两种BeanFactory和ApplicationContext),获取实例对象:

public class SpringTest {

	@Test
	public void testHello() throws Exception {
		//1.获到核心配置文件  applicationContext.xml 	source folder为根目录
		ClassPathResource resource = new ClassPathResource("applicationContext.xml");
		//2.拿到核心对象(相当于启动了框架)
		// BeanFactory:Bean工厂
		BeanFactory factory = new XmlBeanFactory(resource);
		
		//3.拿到配置的bean对象,有3种方式
		// 		1、根据名称获到bean对象(Spring不知道类型,所以需要强转)
		//HelloBean bean = (HelloBean) factory.getBean("helloBean");
		// 		2、根据类型获取bean对象(不能出现多个class相同,但id不同的类型,这样Spring就不知道该返回哪个类型,从而报错)
		//HelloBean bean = factory.getBean(HelloBean.class);
		// 		3、根据名称与类型来获取	精确获取
		HelloBean bean = factory.getBean("helloBean",HelloBean.class);
		System.out.println(bean);
	}
	
	
	@Test
	public void testHello2() throws Exception {
		//1.获到核心配置文件  applicationContext.xml
		//2.拿到核心对象(相当于启动了框架)
		//ClassPathXmlApplicationContext
		// 注意:ApplicationContext就是一个Bean工厂,且功能强大得多		获取配置文件,并启动Spring,合并上面2步
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
		HelloBean bean = context.getBean("helloBean",HelloBean.class);
		System.out.println(bean);
	}
}

==================================================================

上面只是在实例化对象,当类中有对象属性时,需通过DI来完成对象属性的赋值,分为xml注入注解注入

1、xml注入
1.1、实体类:

public class YouBean {

}
public class MyBean {
	/**
	 * 赋值都是通过set方法,所以如果是通过xml注入,那么对应字段必定有set方法
	 */
	private String name;
	public void setName(String name) {
		this.name = name;
	}
	
	private YouBean youBean;
	public void setYouBean(YouBean youBean) {
		this.youBean = youBean;
	}

	public void save(){
		System.out.println("youBean:"+youBean);
		System.out.println("name:"+name);
	}
}

1.2、配置文件:

  <!-- 
  	配置个bean对象,就相当于:
  	MyBean myBean = new MyBean();
  	myBean.setYouBean(youBean); //使用javabean的可写属性
  	
  	给类的字段赋值,就是在调用set方法,下面name属性里是set方法名,去掉set,然后首字母小写
   -->
 <bean id="myBean" class="cn.itsource._02_di.MyBean">
 	<property name="name" value="shp" /><!-- 常见类型,value即可 -->
 	<!-- 
 		property:属性 
 			name:就是这个属性的名称值(和setXxx有关系)
 			ref:引用(具体的对象)/value:直接设值
 	-->
 	<property name="youBean" ref="youBean"></property><!-- 对象,通过id引用赋值,将工厂里已经创建的对象给字段 -->
 </bean>	
 
 
 <bean id="youBean" class="cn.itsource._02_di.YouBean"></bean>	

2、注解注入:注入容器中有的Bean
2.1、实体类

public class MyBean {

	/**
	 * @Autowired :Spring包中的 => 功能更加强大,和Spring合成更好用
	 * @Resource :javax => java原生的,扩展性强
	 * 	Spring在创建对象时,只要看到这里有一个这个注解,它就会把你要的对象注入进来,不需要set()
	 */
	@Autowired//默认按照类型【子类也可以】匹配,如果有多个类型一样的Bean,按照名字匹配,匹配不上报错
//	@Qualifier("youBean2")//可以使用这个注解指定Bean的名称

	//@Resource //默认按照名字取匹配,但是类型必须对应;这就是为什么Autowired更常用
	//@Resource(name="otherBean1")//指定Bean的名称
	private YouBean youBean;
	
	private String name;
	public void setName(String name) {
		this.name = name;
	}

	public void save(){
		System.out.println("youBean:"+youBean);
		System.out.println("name:"+name);
	}	
}

2.2、配置文件


 <bean id="myBean" class="cn.itsource._02_di.MyBean">
 	<property name="name" value="shp" /><!-- 常见类型 -->
 	<!-- 用了注解,这里就不需要ref了-->
 </bean>	
 
 <bean id="youBean" class="cn.itsource._02_di.YouBean"></bean>	

测试:

	@Test
	public void testDi() throws Exception {
		//读取配置文件,拿到核心对象(启动框架)
		ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
		//获取bean对象
		MyBean bean = ac.getBean("myBean",MyBean.class);
		
		bean.save();
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值