spring-Ioc/di

spring发展

2002 Rod Johnon
Spring 2003 ,IOC Aop
产品:Spring data,spring boot,spring cloud,spring framework ,spring social

IOC:控制反转(亦称 DI:依赖注入)

对象创建发展史: new 创建 -> 简单工厂 -> 超级工厂(ioc)

控制反转 :将 创建对象、属性值 的方式 进行了翻转,从new、setXxx() 翻转为了 从springIOC容器getBean()
依赖注入:将属性值 注入给了属性,将属性 注入给了bean,将bean注入给了ioc容器;
无论要什么对象,都可以直接去springioc容器中获取,而不需要自己操作(new\setXxx())
因此之后的 ioc 分为2步:1 先给springioc中存放对象并赋值 2 拿

1、jar

开发spring至少需要使用的jar(5+1):
	spring-aop.jar		开发AOP特性时需要的JAR
	spring-beans.jar	处理Bean的jar			<bean>
	spring-context.jar	处理spring上下文的jar		<context>
	spring-core.jar		spring核心jar
	spring-expression.jar	spring表达式 
三方提供的日志jar
	commons-logging.jar	日志

2、编写配置文件 applicationContext.xml

实体类

实现对应的getter  and setter 方法
public class Student {
	private int stuNo ; 
	private String stuName ; 
	private int stuAge ;
	}

加入IOC容器

id:唯一标识符    class:指定类型 
<bean id="student" class="org.zq.entity.Student">
		<property name="stuNo" value="2"></property>
		<property name="stuName" value="ls"></property>
		<property name="stuAge" value="24"></property>
		 	<!-- 
		 	property:class所代表的类的属性
			name:属性名
			value:属性值
			-->
	</bean>

3、开发Spring程序(IOC)

//获取IOC容器对象
ApplicationContext conext = new ClassPathXmlApplicationContext("applicationContext.xml") ;
		//从IOC获取学生对象
		Student student = (Student)conext.getBean("student") ;

IOC容器赋值:如果是简单类型(8个基本+String),value;
如果是对象类型,ref=“需要引用的id值”,因此实现了 对象与对象之间的依赖关系
conext.getBean(需要获取的bean的id值)

实现注入(赋值)的三种方式
1.set注入:通过setXxx()赋值

默认使用的是 set方法();
依赖注入底层是通过反射实现的。
** 标签:<property…>

2.构造器注入:通过构造方法赋值

<constructor-arg value=“ls” type=“String” index=“0” name=“name”></constructor-arg>

相关属性
	index: 参数的索引位  从 0 开始(不推荐使用)
	name:参数名  (推荐使用)
	type: 参数类型
	value: 参数值
3.p命名空间注入

<bean id=“teacher” class=“org.zq.entity.Teacher” p:age=“25” p:name=“ww” ></bean>

注意:
	使用p命名空间注入时, 需要先引入p命名空间
	xmlns:p="http://www.springframework.org/schema/p"
	简单类型:
		p:属性名="属性值"
	引用类型(除了String外):
		p:属性名-ref="引用的id"
	注意多个 p赋值的时候 要有空格。
注意**
无论是String还是Int/short/long,在赋值时都是 value="值" ,
因此建议 此种情况 需要配合 name\type进行区分

给对象类型赋值null :
	<property name="name" >  
			<null/>       -->注意 没有<value>
	</property>
赋空值 ""  
	<property name="name" >  
			<value></value>  
	</property>
对集合类型赋值(array、list、set、map、properties)
都有相对应的标签
	1<list>
		 	<value>
	2<array>
			<value>
	3<set>
			<value>
	4<map>
			<entry>
				<key>
					<value>				
				<value>
5<props>
			<prop key="foot4">足球4</prop>

某些可以混着用但是不建
在这里插入图片描述

自动装配
<bean ... class="org.zq.entity.Course"  autowire="byName|byType|constructor|no" > 
	 byName本质是byId
  • byName: 自动寻找:其他bean的id值=该Course类的属性名
  • byType: 其他bean的类型(class) 是否与 该Course类的ref属性类型一致 (注意,此种方式 必须满足:当前Ioc容器中 只能有一个Bean满足条件 )
  • constructor: 其他bean的类型(class) 是否与 该Course类的构造方法参数 的类型一致;此种方式的本质就是byType
全局自动装配

可以在头文件中 一次性将该ioc容器的所有bean 统一设置成自动装配:

<beans xmlns="http://www.springframework.org/schema/beans"
...
default-autowire="byName">

自动装配虽然可以减少代码量,但是会降低程序的可读性,使用时需要谨慎

使用注解定义bean:通过注解的形式 将bean以及相应的属性值 放入ioc容器

<context:component-scan base-package="org.zq.dao">
自动装配流程
  • </context:component-scan>Spring在启动的时候,会根据base-package在 该包中扫描所有类,查找这些类是否有注解@Component(“studentDao”),如果有,则将该类 加入spring Ioc容器。
    会扫描该注解

@Component细化:

dao层注解:@Repository
service层注解:@Service
控制器层注解:@Controller
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值