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>
属性注入(用什么方式给成员变量赋值)
- 通过构造器注入
- set方法注入(重点)
- 使用接口注入
<!-- 使用有参构造器注入属性值 -->
<!-- 使用有参构造器注入属性值 -->
<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>
注入对象类型属性
步骤:
- 在service中把dao作为一个类型属性
- 生成dao类型属性的set方法
- 在配置文件中注入关系
<!-- 注入对象类型的属性 -->
<!-- 配置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)ServletContext对象
2)监听器 - 具体应用:
1)在服务器启动的时候为web项目创建一个ServletContext对象
2)在ServletContext对象创建的时候,可以通过监听器监听到该对象的创建
3)使用监听器在该对象的创建的时候加载spring配置文件,就可以创建配置文件指定的对象
4)可以使用ServletContext对象的getAttribute()和setAttribute()设置和获取对象
注解的方式管理bean
步骤
- 开启注解扫描 扫描指定包中带注解的类
- 需要在对应的类上面使用注解
- 测试
<?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”) 多例 |
说明
- 前四个注解在创建对象的时候功能是一致的,都可以创建对象。
- 使用@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...");
}
}
使用注解的方式注入属性
- @Autowired:自动注入属性
- @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();
}
}
配置文件和注解的混合使用方式
- 创建对象使用配置文件方式实现
- 注入属性使用注释的方式实现