Spring_01---spring入门、ioc配置创建对象、属性注入等

本文详细介绍了Spring框架的基本概念,包括IOC配置文件的创建与问题解决,通过XML方式管理Bean的实例化及各种属性注入方法,如构造器注入、setter注入和对象类型属性注入。此外,还探讨了Spring在web项目中的整合原理和IOC与DI的区别。

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

一、Spring概念


1 spring是开源的轻量级框架

2 spring核心主要两部分:
	1)aop:面向切面编程,实现扩展功能时不修改源代码
	2)ioc:控制反转--通过配置spring的方式创建类对象,而不是new
	   ioc好处:当类的路径发生变化时,只需修改配置文件,不需要修改代码。
	   
	   ioc操作有两种方式:
		 1)ioc的配置文件方式
		 2)ioc的注解方式

3 spring是一站式框架
	1)spring在javaee三层结构中,每一层都提供不同的解决技术
		- web层:springMVC
		- service层:spring的ioc
		- dao层:spring的jdbcTemplate

4 spring版本
(1)hibernate5.x
(2)spring4.x

二、ioc的配置文件


ioc配置底层使用的技术
	1)xml配置文件
	2)dom4j解决xml
	3)工厂设计模式
	4)反射

ioc实现原理

在这里插入图片描述

2.2 IOC配置入门案例
第一步 导入jar包
	   - 四个核心的jar包; 两个支持日志输出的jar包
第二步 创建类,在类里面创建方法
第三步 创建spring配置文件,配置创建类
		步骤:
			1)spring核心配置文件名称和位置不是固定的
				- 建议放到src下面,官方建议applicationContext.xml
			2)引入schema约束
			3)配置对象创建
第四步 测试

代码示例:
	xml:
		<?xml version="1.0" encoding="UTF-8"?>

		<!-- 引入schema约束 -->
		<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">
			
			<!-- 配置类 -->
			<bean id="user" class="ioctest.User"></bean>

		</beans>

	测试类:
		public class IocTest {
		@Test
		public void iocTest() {
			// 1 加载spring配置文件,根据<bean>创建对象 
			// 原理:底层封装了dom4j解析和反射功能
			ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
			
			// 2 得到配置创建的对象  传参为<Bean>标签的id值
			User user = (User) context.getBean("user");
			
			// 3 输出测试
			System.out.println(user);
			user.add();
		}
		}
2.3 解决配置文件没有提示的问题
原理:向spring中引入schema约束,应把约束文件引入到eclipse中

先复制约束路径 , 粘贴到Key值中
在这里插入图片描述

三、Spring的bean管理(xml方式)


3.1实例化bean的三种方式
1)使用类的无参构造创建(重点)
	public class User {
		public void add() {
			System.out.println("add().......");
		}
	}
	问题:如果类里面没有无参构造,则会出现异常


2)使用静态工厂创建
	流程:在类中创建静态方法,返回类对象
	代码:
	public class StaticFactory {
		//使用静态方法,返回创建对象
		public static Bean getBean(){
			return new Bean();
		}
	}
 

3)使用实例工厂创建
	流程:在类中创建非静态方法,返回类对象
	代码:
	public class InstantiationFactory {
		//普通方法,返回创建对象
		public Bean getBean(){
			return new Bean();
		}
	}
3.2 三种方式的xml配置:
	<!-- 引入schema约束 -->
	<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="user" class="ioctest.User"></bean>
		

	<!-- 2 使用静态工厂创建对象 -->
			<bean id="bean" class="ioctest.StaticFactory" factory-method="getBean"></bean>

		
	<!-- 3 使用实例工厂创建对象 -->
		<!-- 先创建工厂对象 ,再使用工厂对象调用方法创建对象 -->
		<bean id="InstantiationFactory" class="ioctest.InstantiationFactory"></bean>
		<bean id="bean" factory-bean="InstantiationFactory" factory-method="getBean"></bean>

	</beans>
3.3 Bean标签常用属性
1)id属性:id属性值任意命名,但不能包含特殊符号
	作用:根据id值得到配置对象

2)class属性:属性值为创建对象所在类的全路径

3)name属性:功能和id属性一样,但可以包含特殊符号

4)scope属性
	- singleton(默认):单实例创建对象
	- prototype:多实例创建对象
 
	- request:创建对象把对象放到request域里面
	- session:创建对象把对象放到session域里面
	- globalSession:创建对象把对象放到globalSession里面

四、属性注入


解释:在创建对象时,向类中属性设置值

注入方式(三种):
	1)使用set方法注入
	2)使用有参数构造注入
	3)使用接口注入
 
 注:在spring框架里面,仅支持前两种方式!!
4.2 使用有参数构造注入属性
思路: 在xml配置中,在<bean>内使用<constructor-arg>标签,设置属性值
	代码示例:
		带参构造原型:
		public class PropertyDemo1 {
			private String username;
			
			//含参构造
			public PropertyDemo1(String username){
				this.username = username;
			}
			
			//输出方法
			public void test1(){
				System.out.println("demo1 username:"+username);
			}
		}
	
	xml:
		<!-- 使用带参构造注入属性 -->
		<bean id="demo1" class="property.PropertyDemo1">
			<!-- 使用<constructor-arg>标签  name为属性名,value为注入属性值-->
			<constructor-arg name="username" value="张三"></constructor-arg>
		</bean>
4.3 使用set方法注入属性(重点)
思路: 在xml配置中,在<bean>内使用<property>标签,设置属性值
	代码示例:
	原型:
		public class Book {
			private String bookname;
			
			//set方法
			public void setBookname(String bookname) {
				this.bookname = bookname;
			}
			
			//输出方法
			public void test1(){
				System.out.println("bookname:"+bookname);
			}
		}

	xml:
		<!-- 使用set方式注入 -->
		<bean id="book" class="property.Book">
			<!-- 使用<property>标签  name为属性名,value为注入属性值 -->
			<property name="bookname" value="JAVA三月通"></property>
		</bean>
4.4 注入对象类型属性(重点)
解释:将一种类对象作为属性 注入到 另一类对象中。

使用场景:用于service层与dao层中。将dao层对象注入到service层中使用。

实现步骤:
	1)创建service类和dao类
	2)在service创建dao类型属性
	3)生成dao类型属性的set方法
	4)配置文件中注入两者关系
 
代码示例:
	类原型:
	public class UserService {

		//定义UserDao类型属性
		private UserDao userDao;
		
		//生成属性set方法
		public void setUserDao(UserDao userDao) {
			this.userDao = userDao;
		}
		
		//测试方法
		public void add(){
			userDao.add();  //调用userDao中方法
		}
	}
	
	public class UserDao {
		//测试方法
		public void add(){
			System.out.println("userDao.....");
		}
	}
	
	
	xml:
		<!-- 配置service和dao对象间关系
			 步骤: 
				1)配置创建两种对象,
				2)在service中声明dao属性(使用peroperty标签)
		-->
		<bean id="userDao" class="property.UserDao"></bean>
		
		<bean id="userService" class="property.UserService">
			<!-- 在service配置中注入dao对象 
				name:service类中属性名称
				ref:被配置对象的bean标签中的id值
			-->
			<property name="userDao" ref="userDao"></property>
		</bean>
	
	测试:
		public class IocTest {
			@Test
			public void iocTest() {
				// 1 加载spring配置文件,根据<bean>创建对象 
				// 原理:底层封装了dom4j解析和反射功能
				ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
				
				// 2 得到配置创建的对象  传参为<Bean>标签的id值
				UserService userService = (UserService) context.getBean("userService");
				
				// 3 输出测试
				userService.add();
			}
		}
4.5 P名称空间注入

约束声明:
在这里插入图片描述
注入格式: p:属性名="属性值"
在这里插入图片描述

4.6 注入复杂类型属性
1) 数组
2) list集合
3) map集合
4) properties类型

xml代码:
	<!-- 注入复杂类型属性值 -->
	<bean id="person" class="property.Person">
		<!-- 数组 -->
		<property name="arrs">
			<list>
				<value>小王</value>
				<value>小马</value>
				<value>小宋</value>
			</list>
		</property>
		
		<!-- list -->
		<property name="list">
			<list>
				<value>小奥</value>
				<value>小金</value>
				<value>小普</value>
			</list>			
		</property>
		
		<!-- map -->
		<property name="map">
			<map>
				<entry key="aa" value="lucy"></entry>
				<entry key="bb" value="mary"></entry>
				<entry key="cc" value="tom"></entry>
			</map>
		</property>
		
		<!-- properties -->
		<property name="properties">
			<props>
				<prop key="driverclass">com.mysql.jdbc.Driver</prop>
				<prop key="username">root</prop>
			</props>
		</property>
	</bean>

五、Spring整合web项目原理


作用:加载spring核心配置文件。

优点:把加载配置文件和创建对象的过程,在服务器启动时候完成

new方式创建对象缺点:功能可以实现,但效率很低

底层技术:
	1)ServletContext对象
	2)监听器

使用细节:
- 流程:
1)服务器启动时,监听器会监听加载配置文件。
2)通过配置文件创建对象。
3)并把创建的对象放进ServletContext域中

-- 放对象到ServletContext域对象里面(setAttribute方法)
-- 取对象,从ServletContext域得到 (getAttribute方法)
5.2 IOC和DI区别
IOC: 控制反转,把对象创建交给spring进行配置
DI: 依赖注入,向类里面的属性中设置值

IOC创建对象,DI向类中属性设置值

关系:DI(依赖注入)不能单独存在,需要在ioc基础之上完成操作
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值