Spring对Bean的管理

bean标签的常用属性
属性含义
id为Bean起名字,唯一,起名遵循变量规范
class类的全类名,通过反射创建实例
name为Bean起名字,可以出现特殊字符;没有id,name可以当成id使用
scope属性来指定bean的范围

scope的取值及含义

取值含义
singleton单例(默认的)
prototype多例
request创建的对象存入到 request 域中
session创建的对象存入到 session 域中.
<bean id="user" class="com.hpe.ioc.User" scope="prototype"></bean>
属性注入(用什么方式给成员变量赋值)
  1. 通过构造器注入
  2. set方法注入(重点)
  3. 使用接口注入
<!-- 使用有参构造器注入属性值 -->
<!-- 使用有参构造器注入属性值 -->
<bean id="user2" class="com.hpe.ioc.User">
	<!-- name:指的是有参构造器的参数,value:指的是属性值 -->
	<constructor-arg name="username" value="tom"></constructor-arg>
	<constructor-arg name="age" value="20"></constructor-arg>
	<constructor-arg name="sex" value=""></constructor-arg>
</bean>
<!-- 使用set注入 -->
<bean id="person" class="com.hpe.ioc.Person">
	<!-- name:类中定义的属性名称,value:设置具体的值 -->
	<property name="name" value="zhangsan"></property>
	<property name="age" value="20"></property>
</bean>
注入对象类型属性

步骤:

  1. 在service中把dao作为一个类型属性
  2. 生成dao类型属性的set方法
  3. 在配置文件中注入关系
<!-- 注入对象类型的属性 -->
<!-- 配置service的dao对象 -->
<bean id="userDao" class="com.hpe.dao.UserDao"></bean>
<bean id="userService" class="com.hpe.service.UserService">
	<!-- 注入UserDao对象,不能使用value属性,使用关联对象ref属性 
		 name的值:UserService是属性名称
		 ref:引入另一个bean的id或者name
	 -->
	<property name="userDao" ref="userDao"></property>
</bean>
注入复杂类型的属性
<!-- 注入复杂类型的属性 -->
<bean id="person2" class="com.hpe.ioc.Person">
	<property name="array">
		<array>
			<value>sing</value>
			<value>football</value>
		</array>
	</property>
	<property name="list">
		<list>
			<value>A</value>
			<value>B</value>
			<value>C</value>
		</list>
	</property>
	<property name="set">
		<set>
			<value>c语言</value>
			<value>Java</value>
			<value>c++</value>
		</set>
	</property>
	<property name="map">
		<map>
			<entry key="name" value="tom"></entry>
			<entry key="tel" value="10086"></entry>
		</map>
	</property>
	
	<!-- Properties -->
	<property name="properties">
		<props>
			<prop key="username">root</prop>
			<prop key="password">1234</prop>
		</props>
	</property>
</bean>
Spring整合web项目的原理
  1. 存在问题:每次操作数据库都需要加载配置文件,性能低
  2. 解决方案:把加载配置文件和创建对象的过程在服务器启动的时候就完成
  3. 具体实现方式:
    1)ServletContext对象
    2)监听器
  4. 具体应用:
    1)在服务器启动的时候为web项目创建一个ServletContext对象
    2)在ServletContext对象创建的时候,可以通过监听器监听到该对象的创建
    3)使用监听器在该对象的创建的时候加载spring配置文件,就可以创建配置文件指定的对象
    4)可以使用ServletContext对象的getAttribute()和setAttribute()设置和获取对象
注解的方式管理bean
步骤
  1. 开启注解扫描 扫描指定包中带注解的类
  2. 需要在对应的类上面使用注解
  3. 测试
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
	<!-- 开启注解扫描
		 base-package:自动扫描指定包的类、方法、属性上的注解
	 -->
	<context:component-scan base-package="com.hpe"></context:component-scan>
</beans>
常用的注解
注解含义
@Component是spring管理组件的通用方式,可以放在类的上面,不推荐使用
@Controller控制器,表示Web层组件
@Service业务类,表示业务层组件
@Repository表示持久层组件
@Scope指定对象的创建方式是单例还是多例。eg:@Scope(value=“singleton”) 单例;@Scope(value=“prototype”) 多例

说明

  1. 前四个注解在创建对象的时候功能是一致的,都可以创建对象。
  2. 使用@Component、@Controller、@Service是为了让标注注解的类本身用途更清晰
// 在类上面使用注解
// 相当于配置方式中<bean id="user",class="com.hpe.po.User"></bean>
@Component(value="user")
//@Scope(value="prototype")
public class User {
	public void add(){
		System.out.println("add...");
	}
}
使用注解的方式注入属性
  1. @Autowired:自动注入属性
  2. @Resource:必须指定name,name属性的值是Dao注解指定的value值
    代码举例:
    UserDao.java
@Repository("userDao")
public class UserDao {
	public void add(){
		System.out.println("dao...");
	}
}

UserService.java

// 下面默认带value@Component(value="userService")
// 下面默认为@Component(value="userService")
// @Service注解可以不指定value值,通过getBean(类名.class)来获得
// value的默认值就是类名的首字母小写
@Service
public class UserService {
	// 得到dao对象
	// 1.定义dao类型属性,在属性上面使用注解完成对象属性注入
	// 如果使用注解,就不需要set方法
	/*@Autowired
	private UserDao userDao;*/
	
	/*public void setUserDao(UserDao userDao) {
		this.userDao = userDao;
	}*/
	
	// 2.使用@Resource,必须指定name
	// name属性值等于使用注解创建对象的value值
	// 相当于<property name="userDao" ref="userDao"></property>
	@Resource(name="userDao")
	private UserDao userDao;
	
	public void add(){
		System.out.println("service...");
		userDao.add();
	}
}

SpringTest.java

public class SpringTest {
	// 注解创建对象
	@Test
	public void test1(){
		// 加载配置文件
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
		User user = (User) context.getBean("user");
		System.out.println(user);
		user.add();
	}
}
配置文件和注解的混合使用方式
  1. 创建对象使用配置文件方式实现
  2. 注入属性使用注释的方式实现
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值