Spring框架基础(二)依赖注入与标注

本文深入解析Spring框架中的依赖注入(DI)概念,包括setter注入、构造器注入和自动化注入方式,探讨了简单值、对象类型及集合类型的参数注入方法,并介绍了组件扫描、标注及其在Spring中的应用。

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

什么是DI

Dependence  Injection  依赖注入(依赖注射) 用来解决 组件值得 装配问题

Spring 容器如何完成注入

  1. setter注入: 参考的是bean 对象 对应的类型中的set方法

      <property  name="参考set方法“  value=”简单值“></property>
     <property name="对象的引用" ref = "容器中的组件Id"></bean>
    
  2. 构造器注入

     参考的是构造方法  将property 换成constructor-arg  
     <bean id = "card" class="com.xdl.bean.Card" lazy-init="true">
     	<constructor-arg name="point" value="A"></constructor-arg>
     	<constructor-arg name="suit" value="梅花"></constructor-arg>
     </bean>
     <bean id="player" class="com.xdl.bean.Player">
     	<constructor-arg index="0" value="10001"></constructor-arg>
     	<constructor-arg index="1" value="高进"></constructor-arg>
     	<constructor-arg index="2" value="1"></constructor-arg>
     	<constructor-arg index="3" ref="card"></constructor-arg>	
     </bean> 
    
  3. 自动化注入

     可以在bean标记中 加一个属性 autowire 通过指定值为byName 就是通过组件的Id 来进行自动注入  。
     也可以设置byType 是按照组件的类型进行自动装配  还可以指定成constructor  是按照构造方法区匹配自动装配。
    
  4. 枚举类型 在配置文件中直接写值即可;

  5. bean参数的注入

    简单值得注入:

     String类型、枚举、java基本类型、java基本类型对应的封装类(共18种类型)
     <property  name ="参考set方法"  value=" 值"  />
     <property	name = " " ><value>值</value></property>
     除基本类型 还可以赋值 null 值,使用<null  />
     例:使用基本值的注入 , 构建连接池对象
     <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
     	<property	name="driverClassName"	value="oracle.jdbc.OracleDriver></property>
     	<property	name="url"	value="jdbc:oracle:thin@localhost:1521:xe" ></property>
     	<property	name="username"	value = "test" ></property>
     	<property	name="password"><value>test</value></property>
     </bean>
    

    对象类型的参数注入:

     	<property	name=" "	ref="bean 组件的id" />
    

    集合类型的注入:

     	List集合----- <list><value>值</value></list>
     	set集合------<set><value>值</value></set>
     	map集合------<map><entry key=" " value=" "></entry></map>
     	Properies类型----<peops>
     						<prop  key="">值</prop>
     				</props>
    

    集合的单独定义:

     如果要重复使用一个集合的数据,可以把集合单独定义一份,方法:
     	在复杂值注入的标签中加 util: ,并定义id,通过id引用;
     	如<util: list	id=""> <value> </value></util:list>
     Properties 特殊 并且可以加载一个对应的 .properties 文件,如:
     	<util:properties	id = "dbparam"	location="classpath:db.properties"></util:properties>
    

    Spring 中的EL表达式:

     Spring中的表达式是从容器中取值 ,取值的语法是把之前的$换成#
    

组件扫描

  1. 什么是组件扫描?

     它是Spring 框架提供一套基于标注(注解)的技术,目的是为了简化XML文件的编写。
    
  2. 如何实现组件扫描

     a:建立一个项目 导入jar包(IOC AOP)  并拷贝Spring 的配置文件到src下
     b : 在Spring 配置文件中开启组件扫描
     	<context:component-scan  base-package="包名“/>
     c : 编写一个Java类; 在这个类上打对应的标注(4个标注,对应4个层)
     	@Repositor 		持久层标注 (DAO,DAOImp)
     	@Service		服务层标注(service)
     	@Controller		控制层标注(controller、ajax等)
     	@Component	通用层标注(bean)
     d : 创建Spring 容器  从容器中获取	对应的组件
    

标注

和IOC相关的(辅助性)标注:	
		
	@Scope				 ("Singleton | prototype") 控制作用域的标注
	@PostConstructor   	代表构造之后的初始化方法 相当于init-method属性
	@PreDestory  		对象销毁之前 相当于destory-method 属性
DI的标注

	@value
	可以用在成员变量   set方法上 用来解决简单值 的注入问题 用法是@value("值");
	如果要赋值 复杂值  则需要使用EL表达式 用法是@value(value="#{对象Id}");

	@AutoWired	(默认要求被查找的组件必须存在,可通过required=false 来更改设定,找不到时不报错)
	可以 用在  成员变量  set方法  构造方法上  解决复杂值的装配问题
	优先按照类型进行查找,若找不到则启用名字查找;	
	@Qualifier 可以用来指定查找组件的名字,不再启用类型查找;但要和@AutoWired结合使用,且不能用于构造方法上

	@Resource 属于JDK的标注	用在成员变量或者set方法上	优先按名字查找,找不到启用类型查找
		注:@Resource从spring容器中获取实例注入到类的成员变量中
  1. .Spring DAO 对JDBC的改进

     简化了DAO实现类的编写  提供了高度的封装的API
     提供了基于AOP的事务管理
     它把JDBC中的检查异常 做了封装,封装成了一个DataAccessException这个异常继承RuntimeException
    

    如何完成的改进

     JDBCTemplate	  jdbc模板类	可以完成驱动加载 连接获取Sql执行环境构建 资源释放
     JdbcDaoSupport  接口支持类	可以提供JdbcTemplate对象
    
  2. 采用继承JdbcDaoSupport 的方式来使用Spring DAO

     步骤:1:建立一个项目 导入jar包(IOC aop jdbc  连接池  数据库驱动) 并拷贝配置文件到 src文件下		
     	2:编写DAO接口		里面定义一个查询 某张表数据量的方法
     	3:编写DAO的实现类		继承JdbcDaoSupport
     		(开启组件扫描、在类上加标注,在配置文件中  建立dataSource 并注入给JdbcDaoSupport)
     		从JdbcDaoSupport 获取模板对象  使用API 完成查询
     		supper.setDataSource(dataSource);//赋值给JdbcDaoSupport这个类
     		supper.getJdbcTemplate().queryForObject(sql,  .class)//使用父类提供的模板进行查询
     		rowMapper 说的是结果集中的一行 转换成对象的过程对象
     	4: 从容器中获取DAO对象  测试
    
  3. RowMapper 是什么?怎么用?

     Spring中的RowMapper可以将数据中的每一行数据封装成用户自定义的类;常与JdbcTemplate一起使用
     在数据库查询中,如果返回的是用户自定义类型的则需要包装,如果是java自定义的则不需要。
     自定义类的包装实现:  通过建立内部类实现RowMapper接口,在内部类mapRow方法中实现;
     例:public  class  UserMapper implements RowMapper{
     		public XdlUser mapRow (ResultSet  rs , int i )  throws  SQLException{
     			XdlUser user = new XdlUser();  		//参数 rs 查询数据库返回的结果集
     			user.setUser_id(rs.getInt("user_id");	//参数 i	
     			user.setName(rs.getString("name"));
     		return user;
     		}
     }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值