< bean >元素的常用属性及其子元素
id | 是一个Bean的唯一标识符,Spring容器对Bean的配置、管理都通过该属性来完成。 |
---|---|
name | Spring亦可通过该属性对容器中的Bean进行配置和管理,name可为Bean指定多个名称,每个名称用逗号或分号隔开。 |
class | 该属性指定了Bean的具体实现类。它必须是一个完整的类名,使用类的全限定名。 |
scope | 用来设定Bean实例的作用域,常用的有:singleton(单例),prototype(原型)。其默认值为singleton(单例)。 |
property | 元素的子元素,用于调用Bean实例中的setter方法完成属性赋值,完成依赖注入,该元素的name属性指定Bean实例中的相应属性名,ref属性或value属性用于指定参数值。 |
ref | 可用于指定Bean工厂中某个Bean实例的引用。 |
value | 可用于直接指定一个常量值。 |
list | 用于封装List或数组类型的依赖注入。 |
set | 用于封装Set类型属性的依赖注入。 |
map | 用于封装Map类型属性的依赖注入。 |
entry |
在开发过程中最常使用的就是普通的构造器实例化方法:spring容器默认调用类中的无参构造方法对Bean进行实例化。
bean的作用域
作用域 | 描述 |
---|---|
singleton | 在spring IoC容器仅存在一个Bean实例,Bean以单例方式存在,bean作用域范围的默认值。 |
prototype | 每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时,相当于执行newXxxBean()。 |
request | 每次HTTP请求都会创建一个新的Bean,该作用域仅适用于web的Spring WebApplicationContext环境。 |
session | 同一个HTTP Session共享一个Bean,不同Session使用不同的Bean。该作用域仅适用于web的Spring WebApplicationContext环境。 |
application | 限定一个Bean的作用域为ServletContext的生命周期。该作用域仅适用于web的Spring WebApplicationContext环境。 |
基于注解Annotation的装配
虽然基于xml配置文件也能实现bean的装配工作(bean的装配就是指的bean的依赖注入),但是代码过于臃肿,所以基于注解的装配就明显方便很多。
点击此处详细学习——Spring基于Annotation装配Bean
相关约束信息,可在index.html——core1.9中找到。
使用注解之后,spring容器就只需要简单的一行代码。对于spring 4.0以上版本需要导入spring-aop的jar包(在框架包的libs文件夹下)
代码:
package com.csdn1.entity;
public interface UserDao {
public void say();
}
package com.csdn1.entity;
import org.springframework.stereotype.Repository;
@Repository("userDao")
public class UserDaoImplement implements UserDao{
@Override
public void say() {
// TODO Auto-generated method stub
System.out.println("com.csdn1.entity.UserDaoImplement:你已经成功创建了一个java类。。");
}
}
package com.csdn1.entity;
public interface UserService {
public void say();
}
package com.csdn1.entity;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
@Service("userService")
public class UserServiceImplement implements UserService{
@Resource(name="userDao")
UserDao beServicedUser;
public void setBeServicedUser(UserDao beServicedUser) {
this.beServicedUser = beServicedUser;
}
@Override
public void say() {
// TODO Auto-generated method stub
System.out.println("com.csdn1.entity.UserServiceImplement:你创建了一个UserService类");
beServicedUser.say();
}
}
<?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
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.csdn1.entity"/>
</beans>
package com.csdn1.entity;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class test {
public static void main(String[] args) {
// TODO Auto-generated method stub
ApplicationContext applicationContext=
new ClassPathXmlApplicationContext("beans.xml");
UserService userService=
(UserService)applicationContext.getBean("userService");
userService.say();
}
}
自动装配:
点击此处详细学习
采用注解方式进行装配,就无法对bean的作用域进行赋值。
但是使用自动装配,在调用者的属性名称就必须要与配置文件中定义的Bean做匹配,不能像注解方法一样随便进行取名。
package com.csdn1.entity;
public interface UserDao {
public void say();
}
package com.csdn1.entity;
public class UserDaoImplement implements UserDao{
@Override
public void say() {
// TODO Auto-generated method stub
System.out.println("com.csdn1.entity.UserDaoImplement:你已经成功创建了一个java类。。");
}
}
package com.csdn1.entity;
public interface UserService {
public void say();
}
package com.csdn1.entity;
public class UserServiceImplement implements UserService{
UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void say() {
// TODO Auto-generated method stub
System.out.println("com.csdn1.entity.UserServiceImplement:你创建了一个UserService类");
userDao.say();
}
}
<?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
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<bean id="userDao" class="com.csdn1.entity.UserDaoImplement"></bean>
<bean id="userService" class="com.csdn1.entity.UserServiceImplement" autowire="byName"></bean>
</beans>
package com.csdn1.entity;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class test {
public static void main(String[] args) {
// TODO Auto-generated method stub
ApplicationContext applicationContext=
new ClassPathXmlApplicationContext("beans.xml");
UserService userService=
(UserService)applicationContext.getBean("userService");
userService.say();
}
}
实验1:集合类型注入
编写UserInfo类,包含用户姓名、性别、年龄、出生年月、个人爱好(list集合),采用set注入和构造注入两种方式,实现这些属性值的注入,并在测试程序中显示所有属性的值。
实验2:编写工厂类(BeanFactory)、Print类(属性:pName、pColor等),要求利用Spring容器通过工厂类BeanFactory生成Print对象。
实验3:利用Spring框架,通过注解方式实现为自己的校园卡充值。
在Dao层建立CardDao类,编写充值方法,实现充值(在控制台显示充值金额),在Biz层建立CardBiz类,编写充值方法,调用Dao层中的充值方法,完成充值。在CardController类中编写充值方法调用CardBiz的充值方法。在程序中,通过代码方式调用控制层充值方法,完成充值,并在控制台显示充值金额。在实现过程中不能利用new 操作来完成类的实例化。观察@Autowired和@Resource进行注解时有何不同。
实验4:根据自己的理解,描述 Bean的装配方式。
T2_Myfactory.java
T2_Print.java
T2_Test.java
T2_PrintImplement.java
实验2:
UserInfo.java
userService.java
UserInfo_Implement.java
实验3:
运行结果
实验1、
实验2、
实验3、