Spring入门详细解读

本文深入解析Spring框架中的IOC(控制反转)和DI(依赖注入)概念,介绍其工作原理及实现方式,包括set注入、构造注入和字段注入等,并详细阐述Spring创建对象的三种方法:空参构造、静态工厂创建和实例工厂创建。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

IOC和DI

         ioc:inverse of control   控制反转

                     我们将创建对象的方式反转了

                     以前创建对象是我们自己开发人员维护,包括依赖关系也是自己注入.

                     使用spring之后,对象以及依赖关系是由spring创建和注入

                     反转控制就是反转了对象的创建方式,从我们自己的创建反转给了程序

    

       DI:Depenency  injection 依赖注入

                      实现IOC实现需要DI做支持

                      注入的方式:

                                 set和get方式注入

                                 构造注入

                                 字段注入

                     注入类型:

                                值注入(8大数据基本类型)

                                引用类型注入(将依赖对象注入)

 

 

spring创建对象的三种方式

                     1.空参构造创建(最常用的方式)

      <!-- bean标签
      		class属性:被管理对象的完整类名
      		name属性:给被管理的对象起的名字,根据该名字获取对象
      		         可以重复,可以使用特殊字符
      		id属性:和name属性一样
      		注意:尽量使用name属性
       -->
      <bean name="user" class="cn.zzu.entity.User"></bean>

                      2.静态工厂创建(方法有static方法,直接调用方法)

public class UserFactory {

	public static User createUser() {
		System.out.println("静态工厂创建");
		return new User();
	}
}
<!-- 静态工厂创建 
			通过调用UserFactory类的createUser方法
		-->
		<!-- name属性:创建的对象的名称,随便填写
			 class属性:类的路径
			 factory-method属性;调用的方法名
		 -->
		<bean name="user2" class="cn.zzu.factory.UserFactory" factory-method="createUser" scope="singleton"></bean>

                    3.实例工厂创建(创建对象的方法不带static,需要创建对象,然后对象调用方法)

//实例工厂创建对象
	@Test
	public User createUser() {	//不是静态方法
		System.out.println("实例工厂");
		return new User();
	}
<!-- 实例工厂创建对象 -->
		<!-- 1.先创建BeanUserFactory对象 -->
		<bean name="beanuserfactory" class="cn.zzu.Factory.BeanUserFactory"> </bean>
		<!-- 2.根据创建的对象调用方法 -->
		<bean name="user3" factory-bean="beanuserfactory" factory-method="createUser"></bean>

bean标签的其他属性

            scope属性

                                singleton,单例对象,被表示为丹丽的对象只会在spring中创建一个

                                prototype,多例原型,被标记的对象,每回使用的时候才会创建对象,每次都是新的对象,注意,:在整合struts的时                                                    候,action必须为多例

                                request:在web程序中使用,每次http请求都会返回一个全新的对象

                                session:在web程序中,每次http请求都会返回一个全新的对象

                                 global session:在web程序中,全局的session,上下文只有一个session

         生命周期属性:

                              配置一个方法为初始化方法,spring会在对象创建之后,立即调用

                                    init-method

                            配置一个方法作为生命周期的销毁方法,spring在容器关闭销毁对象之前调用

                                   destroy=method

<bean name="user" class="com.sjtu.bean.User" scope="singleton" init-method="init" destroy-method="destroy"></bean>
//并在User中实现此方法
public void init() {
        System.out.println("初始化");
    }

    public void destroy() {
        System.out.println("销毁");
    }

主配置文件引入其他的配置文件:

//在主配置文件中做如下配置
<import resource="com/sjtu/b_create/applicationContext.xml"/>

属性注入

         set方法注入(****)(前提是在实体类中提供set方法)

package cn.zzu.entity;


public class Car {

	private String name;
	private String color;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getColor() {
		return color;
	}
	public void setColor(String color) {
		this.color = color;
	}
	public Car() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Car(String name, String color) {
		super();
		this.name = name;
		this.color = color;
	}
	
	
}
<bean name="user" class="cn.zzu.entity.User" >
    <!--值类型注入:为User对象中名为name的属性注入tom作为值-->
    <property name="name" value="tom"></property>
    <property name="id" value="18"></property>
    <!--引用类型注入:为car属性注入下方配置的car对象   car是user中一个对象-->
    <property name="car" ref="car"></property>
  </bean>
  <!--将car对象配置到容器中 -->
  <bean name="car" class="cn.zzu.entity.Car">
    <property name="name" value="兰博基尼"></property>
    <property name="color" value="黄色"></property>
</bean>  

         有参构造方法注入前提(前提是实体类中得有有参构造函数)

 		<!-- 构造函数的注入 -->
 		<bean name="user2" class="cn.zzu.entity.User">
 			<!-- 
 				name属性:构造函数参数名
 				index属性:构造函数索引
 				type属性:构造函数参数类型
 				注意:上面的属性不必要全部出现
 			 -->
 			<constructor-arg name="name" value="tom" index="0" type="java.lang.String"></constructor-arg>
 			<constructor-arg name="id" value="1" index="1" type="java.lang.Integer"></constructor-arg>
 			<constructor-arg name="car" ref="car"></constructor-arg>
 		</bean>
 		
 		<bean name="car" class="cn.zzu.entity.Car">
 			<constructor-arg name="name" value="大众"></constructor-arg>
 			<constructor-arg name="color" value="红色"></constructor-arg>
 		</bean>

        p名称空间注入(了解,实际上是set注入)

           

	<!-- 
	 p空间注入  走set注入
	 	1.导入p空间名称  xmlns:p="http://www.springframework.org/schema/p"
	 	2.使用p:完成属性注入
	 -->
	<bean name="user3" class="cn.zzu.entity.User" p:name="张三" p:id="12" p:car-ref="car">
	</bean>
	<!-- car对象的创建 -->
	<bean name="car" class="cn.zzu.entity.Car">
		<property name="name" value="奥迪"></property>
		<property name="color" value="黑色"></property>
	</bean>

     spel注入(了解)

	<!-- spel注入:spring expression language spring表达式 -->
	<bean name="user4" class="User">
		<property name="name" value="#{user.name}"></property>
		<property name="age" value="#{user.age}"></property>
		<property name="car" ref="car"></property>
	</bean>

复杂类型的注入:

             数组注入:

	<!-- 向数组中注入值 -->
	<bean name="collection" class="cn.zzu.entity.Collection">
		<property name="arr" >
			<array>
				<value>tom</value>
				<value>jack</value>
			</array>
		</property>
	</bean>

              list注入:

<!-- 向list中注入值 -->
		<property name="list">
			<list>
				<value>tom</value>
				<value>jack</value>
			</list>
		</property>

              map注入:

<!-- 向map中注入值 -->
		<property name="map">
			<map>
				<entry key="1" value="zhangsan"></entry>
				<entry key="2" value="lisi"></entry>
			</map>
		</property>

              prop注入:

<!-- 向prop中注入值 -->
		<property name="prop">
			<props>
				<prop key="1">张三</prop>
				<prop key="2">李四</prop>
				<prop key="3">王五</prop>
			</props>
		</property>
	<bean name="collection" class="cn.zzu.entity.Collection">
		<!-- 向数组中注入值 -->	
		<property name="arr" >
			<array>
				<value>tom</value>
				<value>jack</value>
			</array>
		</property>
		
		<!-- 向list中注入值 -->
		<property name="list">
			<list>
				<value>tom</value>
				<value>jack</value>
			</list>
		</property>
		
		<!-- 向map中注入值 -->
		<property name="map">
			<map>
				<entry key="1" value="zhangsan"></entry>
				<entry key="2" value="lisi"></entry>
			</map>
		</property>
		
		<!-- 向prop中注入值 -->
		<property name="prop">
			<props>
				<prop key="1">张三</prop>
				<prop key="2">李四</prop>
				<prop key="3">王五</prop>
			</props>
		</property>
	</bean>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值