0
点赞
收藏
分享

微信扫一扫

Spring(2)自动装配

独孤凌雪 2022-03-25 阅读 65
spring

一、装配:Spring在Bean与Bean之间建立依赖关系的行为。

有3种方式:

  • 手动维护:在<constructor-arg>或者<property>标签种通过ref属性进行装配。
    <bean id="dept" class="org.caoze.autoWired.Dept">
        <property name="deptNo" value="1"></property>
        <property name="deptName" value="技术部"></property>
    </bean>-->
    
    <bean id="employee" class="org.caoze.autoWired.Employee">
        <property name="empNo" value="002"></property>
        <property name="empName" value="小曹"></property>
    
        <!--通过ref="dept"将"dept"与"employee"进行关联,这样就可以在类employee中使用类dept了,并且            
        可以直接将dept定义的属性注入到employee中了。-->
    
        <property name="dept" ref="dept"></property>
    </bean>
  • 通过autowire自动装配:
byName

        按名称自动装配。Spring会根据Java类中对象属性的名称,在整个应用的上下文ApplicationContext(Ioc容器)中查找,若某个Bean的id或name属性值与这个对象属性名称相同,则获取这个Bean,并与当前的Java类Bean建立关联。

byType                按类型自动装配。Spring 会根据 Java 类中的对象属性的类型,在整个应用的上下文 ApplicationContext(IoC 容器)中查找。若某个 Bean 的 class 属性值与这个对象属性的类型相匹配,则获取这个 Bean,并与当前的 Java 类的 Bean 建立关联关系。
constructor

        与buType模式相似,不同之处在于他应用于构造器参数,如果在容器中没有找到与构造器参数类型一致的Bean,那么将抛出异常。

        其实就是根据构造器参数的数据类型,进行byType模式的自动装配。

default                表示默认采用上一级元素<beans>设置的自动装配规则装配。
no                       默认值表示不使用自动装配。
    <!--按名称自动装配,xml中bean的id或name必须与类中的属性名相同,即在类employee中必须有一个属性            
    名为dept-->
    <bean id="dept" class="org.caoze.autoWired.Dept">
        <property name="deptNo" value="1"></property>
        <property name="deptName" value="技术部"></property>
    </bean>

    <bean id="employee" class="org.caoze.autoWired.Employee" autowire="byName">
        <property name="empNo" value="002"></property>
        <property name="empName" value="小张"></property>
    </bean>


    <!--根据构造函数自动装配,两个类的属性注入使用的就是构造函数注入,然后再将类dept装配进类 
    employee中-->
    <bean id="dept" class="org.caoze.autoWired.Dept">
        <constructor-arg name="deptNo" value="1"></constructor-arg>
        <constructor-arg name="deptName" value="技术部"></constructor-arg>
    </bean>

    <bean id="employee" class="org.caoze.autoWired.Employee" autowire="constructor">
        <constructor-arg name="empNo" value="002"></constructor-arg>
        <constructor-arg name="empName" value="小张"></constructor-arg>
    </bean>
  • 通过注解自动装配

        1、新建如下所示的文件目录结构

          2、首先在Beans.xml中开启组件扫描功能

<context:component-scan base-package="org.caoze"></context:component-scan>

        3、新建接口UserDao.java

package org.caoze.Dao;

public interface UserDao {
    public void print();
}

        4、新建接口UserDao的实现类UserDaoImpl.java

package org.caoze.Dao.impl;

import org.caoze.Dao.UserDao;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Repository;

//@Repository将数据访问层的类标识为Spring中的bean
// @Repository("UserDao")
@Component("userDao")
public class UserDaoImpl implements UserDao {
    @Override
    public void print() {
        System.out.println("first");
    }
}

        5、新建接口UserService.java

package org.caoze.service;

public interface UserService {
    public void out();
}

        6、新建接口UserService的实现类UserServiceImpl.java

import org.caoze.Dao.UserDao;
import org.caoze.Dao.impl.UserDaoImpl;
import org.caoze.service.UserService;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;

//@Service:将业务层(service)的类标识为Spring中的bean
// @Service("userService")
@Component("userService")
public class UserServiceImpl implements UserService {

    //@Resource:默认按照Bean的名称装配(装配:spring在bean与bean之间建立依赖关系的行为)
    @Resource(name = "userDao")
    private UserDao userDao;

    //这是不使用spring来创建实例,即通过类来新建对象。
    // UserDao userDao = new UserDaoImpl();

    public UserDao getUserDao(){
        return userDao;
    }

    public void setUserDao(UserDao userDao){
        this.userDao = userDao;
    }

    public void out(){
        userDao.print();
        System.out.println("second");
    }
}

        7、新建UserController.java

import org.caoze.service.UserService;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;

import javax.annotation.Resource;

//@Controller:将控制层(controller)的类表识为spring中的bean
// @Controller("userController")
@Component("userController")
public class UserController {
    @Resource
    private UserService userService;

    public void setUserService(UserService userService) {
        this.userService = userService;
    }

    public UserService getUserService() {
        return userService;
    }

    public void doStr(){
        userService.out();
        System.out.println("third");
    }
}

        8、新建测试文件MainApp.java

import org.caoze.controller.UserController;
import org.caoze.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
        UserController obj = context.getBean("userController",UserController.class);
        obj.doStr();
    }
}

        9、运行MainApp.java,控制台打印出以下内容:

 

举报

相关推荐

0 条评论