Spring中的Bean

Bean的配置

spring bean 就是被Spring 管理的Java类。

XML配置方式

通过XML文件来注册bean并管理Bean之间的依赖关系。

 XML配置文件的根元素是<beans>,<beans>中包含了多个<bean>子元素,每一个<bean>子元素定义了一个Bean,并描述了该Bean如何被装配到Spring容器中。

<bean>的常用属性:

 

Bean的实例化

构造器实例化(推荐用这个)

 <bean id="bean1" class="com.itheima.instance.constructor.Bean1" />

静态工厂方式实例化

public static Bean2 createBean(){ return new Bean2(); }

 <bean id="bean2" class="com.itheima.instance.static_factory.MyBean2Factory"
           factory-method="createBean" />

实例工厂方式实例化

 public Bean3 createBean(){
                 return new Bean3();
          }

<bean id="myBean3Factory" class="com.itheima.instance.factory.MyBean3Factory" />
<bean id="bean3" factory-bean="myBean3Factory" factory-method="createBean" />

 

Bean的作用域(7个)

singleton是Spring容器默认的作用域,当Bean的作用域为singleton时,Spring容器就只会存在一个共享的Bean实例。singleton作用域对于无会话状态的Bean(如Dao 组件、Service组件)来说,是最理想的选择。

<bean id="scope" class="com.itheima.scope.Scope" scope="singleton"/>

 对需要保持会话状态的Bean(如Struts 2的Action类)应该使用prototype作用域。在使用prototype作用域时,Spring容器会为每个对该Bean的请求都创建一个新的实例

<bean id="scope" class="com.itheima.scope.Scope" scope=" prototype "/>

 

Bean的生命周期

Spring容器可以管理singleton作用域的Bean的生命周期,在此作用域下,Spring能够精确的知道该Bean何时被创建,何时初始化完成,以及何时被销毁。

prototype作用域的Bean,Spring只负责创建,当容器创建了Bean实例后,Bean的实例就交给客户端代码来管理,Spring容器将不再跟踪其生命周期。

Spring容器中Bean的生命周期流程如下图所示:

 

Bean的装配方式

 创建对象的协作关系称为装配,也就是DI(依赖注入)的本质。而在Spring容器中对bean的创建时就需要对它所依赖的对象进行注入装配。

基于XML的装配

创建Java类,提供有参、无参构造以及属性setter方法

 public User(String username, Integer password, List<String> list) {
    super();
        this.username = username;
        this.password = password;
    this.list = list;
      }
      public User() { super();}
      ......
      //省略属性setter方法

创建Spring配置文件beans5.xml,使用2种方式配置Bean

参考Spring 通过XML配置装配Bean

<bean id="user1" class="com.itheima.assemble.User">
         <constructor-arg index="0" value="tom" />

  ...
      </bean>
      <bean id="user2" class="com.itheima.assemble.User">
        <property name=“username” value=“张三”  />
        ...
      </bean>

创建测试类,测试程序

public class XmlBeanAssembleTest {
          public static void main(String[] args) {
     String xmlPath = "com/itheima/assemble/beans5.xml";
    ApplicationContext applicationContext =
                      new ClassPathXmlApplicationContext(xmlPath);
                 System.out.println(applicationContext.getBean("user1"));
                 System.out.println(applicationContext.getBean("user2"));
      }
}

基于Annotation的装配

常用注解

@Component:用于描述Spring中的Bean,它是一个泛化的概念,仅仅表示一个组件。

@Repository:用于将数据访问层(DAO)的类标识为Spring中的Bean 。

@Service:用于将业务层(Service)的类标识为Spring中的Bean。

@Controller:用于将控制层(Controller)的类标识为Spring中的Bean 。

@Autowired:用于对Bean的属性变量、属性的setter方法及构造方法进行标注,配合对应的注解处理器完成Bean的自动配置工作。

@Resource:其作用与Autowired一样。@Resource中有两个重要属性:name和type。Spring将name属性解析为Bean实例名称,type属性解析为Bean实例类型。

@Qualifier:与@Autowired注解配合使用,会将默认的按Bean类型装配修改为按Bean的实例名称装配,Bean的实例名称由@Qualifier注解的参数指定。

创建接口UserDao,并定义方法

创建接口实现类UserDaoImpl

public class UserDaoImpl implements UserDao{
   public void save(){
       System.out.println("userdao...save...");
   }
}

创建接口UserService,并定义方法

创建接口实现类UserServiceImpl,使用@Resource注入UserDao属性

   public class UserServiceImpl implements UserService{
     @Resource(name="userDao")
     private UserDao userDao;
     public void save() {
         this.userDao.save();
         System.out.println("userservice...save...");

     }
  }

创建控制器类,使用@Resource注入UserService属性

    public class UserController {
     @Resource(name="userService")
     private UserService userService;
    public void save(){
         this.userService.save();
         System.out.println("usercontroller...save...");
     }
    }

创建Spring配置文件,配置Bean

 <beans xmlns="http://www.springframework.org/schema/beans"    
    xmlns:context="http://www.springframework.org/schema/context"
    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-4.3.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-4.3.xsd">   
     <context:annotation-config /><!--开启注解处理器-->
   <bean id="userDao" class="com.itheima.annotation.UserDaoImpl" />
   <bean id="userService" class="com.itheima.annotation.UserServiceImpl" />
   <bean id="userController" class="com.itheima.annotation.UserController" />   
</beans>

创建测试类,并添加aop包

    public class AnnotationAssembleTest {
           public static void main(String[] args) {
                String xmlPath = "com/itheima/annotation/beans6.xml";
    ApplicationContext applicationContext =
                  new ClassPathXmlApplicationContext(xmlPath);
    UserController userController =
                   (UserController) applicationContext.getBean("userController");
     userController.save();
          }

小提示: 除了可以像示例中通过<bean>元素来配置Bean外,还可以通过包扫描的形式来配置一个包下的所有Bean:
<context:component-scan base-package="com.itheima.annotation" />

修改如下:

用@Repository声明Dao类

用@Service声明Service类

用@Controller声明Controller类

@Repository("userDao")
public class UserDaoImpl implements UserDao{

@Service("userService")
   public class UserServiceImpl implements UserService{

@Controller("userController")
    public class UserController {

<beans xmlns="http://www.springframework.org/schema/beans"    
    xmlns:context="http://www.springframework.org/schema/context"
    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-4.3.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-4.3.xsd">
    
    <context:component-scan base-package="com.itheima.annotation" />
    
</beans>

自动装配

 所谓自动装配,就是将一个Bean自动的注入到到其他Bean的Property中。 Spring的<bean>元素中包含一个autowire属性,我们可以通过设置autowire的属性值来自动装配Bean。

autowire属性有5个值,其值及说明下表所示:

修改上一节UserDao、UserServiceImple和UserController,注释掉注解,分别增加类属性的setter方法

//@Repository("userDao")
public class UserDaoImpl implements UserDao {

//@Service("userService")
public class UserServiceImpl implements UserService {
    
    //@Resource(name="userDao")
    private UserDao userDao;
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

//@Controller("userController")
public class UserController {
     //@Resource(name="userService")
     private UserService userService;
     public void setUserService(UserService userService) {
        this.userService = userService;
    }

修改Spring配置文件,使用autowire属性配置Bean

<bean id="userDao" class="com.itheima.annotation.UserDaoImpl" />
<bean id="userService" class="com.itheima.annotation.UserServiceImpl" autowire="byName" />
<bean id="userController" class="com.itheima.annotation.UserController" autowire="byName" />

重新测试程序。

 

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值