Spring中的Bean——装载

Bean的装配方式

Bean的装配可以理解为依赖关系注入

  1. 基于XML的装配

  a) 设值注入

i.要求:

  1. Bean 类必须提供一个默认的无参构造方法。
  2. Bean 类必须为需要注入的属性提供对应的setter方法。

  b) 构造注入

package com.itheima.assemble;

import java.util.List;

public class User {
    private String username;
    private Integer password;
    private List<String> List;
    /*
     * 1.使用构造注入
     * 1.1提供所有带参数的有参构造方法
     */
    public User(String username,Integer password,List<String> List){
        super();
        this.username = username;
        this.password = password;
        this.List = List;
    }
    /*
     * 2.使用设值注入
     * 2.1提供默认空构造方法
     * 2.2为所有属性提供setter方法
     */
    public User(){

    }
    public void setUsername(String username) {
        this.username = username;
    }
    public void setPassword(Integer password) {
        this.password = password;
    }
    public void setList(List<String> list) {
        List = list;
    }
    @Override
    /*
     * (non-Javadoc)
     * @see java.lang.Object#toString()
     * 为了输出是看到结果,重写toString()方法
     */
    public String toString() {
        return "User [username=" + username + ", password=" + password + ", List=" + List + "]";
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    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.xsd">
<!-- 1.使用构造注入方式装配User实例 -->
<bean id="user1" class="com.itheima.assemble.User">
<constructor-arg index="0" value="tom"></constructor-arg>
<constructor-arg index="1" value="123456"></constructor-arg>
<constructor-arg index="2">
    <list>
    <value>"constructorvalue1"</value>
    <value>"constructorvalue2"</value>
    </list>
</constructor-arg>
</bean>
<!-- 2.使用设值注入装配User实例 -->
<bean id="user2" class="com.itheima.assemble.User">
    <property name="username" value="张三"></property>
    <property name="password" value="654321"></property>
    <!-- 注入list集合 -->
    <property name="list">
        <list>
            <value>"setlistvalue1"</value>
            <value>"setlistvalue2"</value>
        </list>
    </property>
</bean>
</beans>

<constructor -arg >元素用于定义构造方法的参数,子元素<Iist>来为Use r 类中对应的list集合属性注入值。

其中<property>元素用于调用Bean实例中的setter方法完成属性赋值,从而完成依赖注入。

package com.itheima.assemble;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class XmlBeanAssembleTest {
    public static void main(String[] args) {
        //定义配置文件路径
        String xmlPath = "com/itheima/assemble/beans5.xml";
        //加载配置文件
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
        //构造方式输出结果
        System.out.println("构造方式:");
        System.out.println(applicationContext.getBean("user1"));
        //设值方式输出结果
        System.out.println("设值方式:");
        System.out.println(applicationContext.getBean("user2"));
    }
}

2.基于Annotation的装配

package com.itheima.annotation;

public interface UserDao {
    public void save();
}
package com.itheima.annotation;

import org.springframework.stereotype.Repository;

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

先使用@Repository 注解将UserDaolmpl 类标识为Spring 中的Bean,其写法相当于配置文件中<bean id="userDao" class="com.itheima.annotation.UserDaolmpl"/>

package com.itheima.annotation;

public interface UserService {
    public void save();
}
package com.itheima.annotation;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;

@Service("userService")
public class UserServiceImpl implements UserService{
    @Resource(name="userDao")
    private UserDao userDao;
    @Override
    public void save() {
        // TODO Auto-generated method stub
        //调用userDao中的save()方法
        this.userDao.save();
        System.out.println("userservice...save...");
    }
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

}

@Service 注解将UserServicelmpl 类标识为Spring中的Bean,这相当于配置文件中<bean id="userService" class="com.itheima.annotation.UserServicelmpl”/> 的编写;然后使用@Resource 注解标注在属性userDao上,这相当于配置文件中<property name="userDao" ref="userDao“/>的写法。

package com.itheima.annotation;

import javax.annotation.Resource;

import org.springframework.stereotype.Controller;

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

}

Controller 注解标注了UserController 类,这相当于在配置文件中编写<bean id="userControll er" class="com .itheima.annotation.UserController"/>; 然后使用了@Resource 注解标注在userService 属性上,这相当于在配置文件中编写<propertyname="userService" ref="userService" />

<?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-4.3.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<!-- 使用context命名空间,在配置文件中开启相应的注释处理器 -->
<context:component-scan base-package="com.itheima.annotation"></context:component-scan>

</beans>
package com.itheima.annotation;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class AnnotationAssembleTest {
    public static void main(String[] args) {
        String xmlPath = "com/itheima/annotation/beans6.xml";
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
        //获取UserController实例
        UserController userController = (UserController)applicationContext.getBean("userController");
        //调用UserController中的save()方法
        userController.save();
    }
}

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-4.3.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<!-- 使用bean元素的autowire属性完成自动装配 -->
<bean id="userDao" class="com.itheima.annotation.UserDaoImpl"></bean>
<bean id="userService" class="com.itheima.annotation.UserServiceImpl" autowire="byName"></bean>
<bean id="userController" class="com.itheima.annotation.UserController" autowire="byName"></bean>
</beans>

增加了autowire 属性,并将其属性值设置为byName 。在默认情况下,配置文件中需要通过ref 来装配Bean ,但设置了autowire=" byName"后,Spring 会自动寻找userServiceBean 中的属性,并将其属性名称与配置文件中定义的Bean 做匹配。由于UserServicelmpl 中定义了userDao 属‘性及其setter 方法,这与配置文件中id 为userDao 的Bean 相匹配,所以Spring会自动地将id 为userDao 的Bean 装配到id 为userService 的Bean 中。

原文地址:https://www.cnblogs.com/tongdaeer/p/12264465.html

时间: 2024-10-25 05:09:25

Spring中的Bean——装载的相关文章

spring配置,spring中的bean 的id不能相同

lib下加入包 spring.jar commons-logging.jar src下添加 applicationContext.xml 1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLS

JSP访问Spring中的bean

JSP访问Spring中的bean <%@page import="com.sai.comment.po.TSdComment"%> <%@page import="com.sai.comment.service.CommentService"%> <%@page contentType="text/html" pageEncoding="UTF-8"%> <%@page import

传统javabean与spring中的bean的区别

javabean已经没人用了 springbean可以说是javabean的发展, 但已经完全不是一回事儿了 用处不同:传统javabean更多地作为值传递参数,而spring中的bean用处几乎无处不在,任何组件都可以被称为bean. 写法不同:传统javabean作为值对象,要求每个属性都提供getter和setter方法:但spring中的bean只需为接受设值注入的属性提供setter方法. 生命周期不同:传统javabean作为值对象传递,不接受任何容器管理其生命周期:spring中的

第2章 Spring中的Bean

2.1 Bean的配置 Bean本质是Java中的类.Spring可以被看做一个大型工厂,这个工厂的作用就是生产和管理Spring容器zho中的Bean.想在项目中使用这个工厂,就需要对Spring的配置文件进行配置. Spring支持XML和Properties两种格式的配置文件.常用XML文件配置,该方式通过XML文件来注册并管理Bean之间的依赖关系. XML配置文件的根元素是<beans>,包含了多个<bean>子元素,每个子元素地定义一个Bean. <bean>

spring 中的 bean 是线程安全的吗?

Spring 不保证 bean 的线程安全.默认 spring 容器中的 bean 是单例的.ZFX代理申请www.fx61.com/brokerlist/zfx.html,当单例中存在竞态条件,即有线程安全问题.如下面的例子计数类package constxiong.interview.threadsafe;/** 计数类 @author ConstXiong @date 2019-07-16 14:35:40*/public class Counter {private int count

Spring 中的bean 是线程安全的吗?

结论: 不是线程安全的 Spring容器中的Bean是否线程安全,容器本身并没有提供Bean的线程安全策略,因此可以说Spring容器中的Bean本身不具备线程安全的特性,但是具体还是要结合具体scope的Bean去研究. Spring 的 bean 作用域(scope)类型 1.singleton:单例,默认作用域. 2.prototype:原型,每次创建一个新对象. 3.request:请求,每次Http请求创建一个新对象,适用于WebApplicationContext环境下. 4.ses

spring中bean的五种作用域?Spring中的bean是线程安全的吗?

spring中bean的五种作用域 当通过spring容器创建一个Bean实例时,不仅可以完成Bean实例的实例化,还可以为Bean指定特定的作用域.Spring支持如下5种作用域: singleton:单例模式,在整个Spring IoC容器中,使用singleton定义的Bean将只有一个实例 prototype:原型模式,每次通过容器的getBean方法获取prototype定义的Bean时,都将产生一个新的Bean实例 request:对于每次HTTP请求,使用request定义的Bea

Spring中管理Bean以及解析XML

Spring是分层的轻量级框架 以IoC(Inverse of Control 反转控制)和AOP(Aspect Oriented Programming 面向切面编程)为核心 应用Spring的好处: 方便解耦,简化开发 Spring就是一个大工厂,可以将所有对象创建和依赖关系维护,交给Spring管理 AOP编程的支持 Spring提供面向切面编程,可以方便的实现对程序进行权限拦截.运行监控等功能 声明式事务的支持 只需要通过配置就可以完成对事务的管理,而无需手动编程 方便集成各种优秀框架

半夜思考之查漏补缺 , Spring 中的 Bean 继承机制

这里的继承 , 不是 Java 中的继承 , 下面就总结下 Bean继承与Java继承的区别: Spring 中的子类 Bean 和父 Bean 可以是不同类型 , 但是 Java 中的继承则可保证子类是一种特殊的父类 ; Spring 中 Bean 的继承时实例之间的关系 , 因此主要表现为参数值的延续 ; 而 Java 中的继承是类之间的关系 , 主要表现为方法和属性的延续 ; Spring 中的子 Bean 不可作为父 Bean 使用 , 不具备多态性 ; 而 Java 中的子类实例完全可