Spring中的Bean——装载

Posted tongdaeer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 中。

 

以上是关于Spring中的Bean——装载的主要内容,如果未能解决你的问题,请参考以下文章

普通java类调用spring中的bean

2.4 装载Bean之使用XML装载

Spring应用上下文中Bean的生命周期

spring Bean

spring练习,在Eclipse搭建的Spring开发环境中,使用set注入方式,实现对象的依赖关系,通过ClassPathXmlApplicationContext实体类获取Bean对象(代码片段

SpringBoot中的自动装载测试