美文网首页Java
Java Spring-组件装配

Java Spring-组件装配

作者: 一亩三分甜 | 来源:发表于2020-01-18 21:17 被阅读0次

<context:component-scan>元素还会自动注册AutowiredAnnotationBeanPostProcessor实例,该实例可以自动装配具有@Autowired和@Resource、@Inject注解的属性。

@Autowired注解自动装配具有兼容类型的单个Bean属性

构造器,普通字段(即使是非public),一切具有参数的方法都可以应用@Autowired注解

默认情况下,所有使用@Autowired注解的属性都需要被设置,当Spring找不到匹配的Bean装配属性时,会抛出异常。若某一属性允许不被设置,可以设置@Autowired注解的required属性为false

默认情况下,当IOC容器里存在多个类型兼容的Bean时,通过类型的自动装配将无法工作,此时可以在@Qualifier注解里提供Bean的名称。Spring允许对方法的入参标注@Qualifiter已指定注入Bean的名称。

@Authwired注解也可以应用在数组属性上,此时Spring将会把所有匹配的Bean进行自动装配。

@authwired注解也可以应用在集合属性上,此时Spring读取该集合的类型信息,然后自动装配所有与之兼容的Bean。

@Authwired注解用在java。util.Map上时,若该Map的键值为String,那么Spring将自动装配与之Map值类型兼容的Bean,此时Bean的名称作为键值

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    public void add(){
        System.out.println("UserService add...");
        userRepository.save();
    }
}

@Controller
public class UserController {

    @Autowired
    private UserService userService;

    public void execute() {
        System.out.println("UserController execute...");
        userService.add();
    }
}

ApplicationContext context = new ClassPathXmlApplicationContext("beans-annotation.xml");
UserController userController = (UserController) context.getBean("userController");
          System.out.println(userController);
          userController.execute();
          
//输出
com.cloud.spring.beans.annotation.controller.UserController@4d1b0d2a
UserController execute...
UserService add...
UserRepositoryImpl Save()

required=false

@Controller
public class UserController {

    @Autowired
    private UserService userService;

    public void execute() {
        System.out.println("UserController execute...");
        userService.add();
    }
}

public class TestObject {
}

public interface UserRepository {
    void save();
}

public class UserRepositoryImpl implements UserRepository{

    @Autowired(required = false)
    private TestObject testObject;

    @Override
    public void save() {
        System.out.println("UserRepositoryImpl Save()");
        System.out.println(testObject);
    }
}

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    public void add(){
        System.out.println("UserService add...");
        userRepository.save();
    }
}

          UserController userController = (UserController) context.getBean("userController");
          System.out.println(userController);
          userController.execute();
//输出
com.cloud.spring.beans.annotation.controller.UserController@4d1b0d2a
UserController execute...
UserService add...
UserRepositoryImpl Save()
null

IOC容器中有两个接口UserRepository的实现类UserRepository和UserJdbcRepository。默认会找bean的名字和属性名相同的为"userRepository"的bean。或在属性前面通过关键字@Qualifier("userRepositoryImpl")指定要装配的接口的实现类的名字。

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    public void add(){
        System.out.println("UserService add...");
        userRepository.save();
    }
}
public interface UserRepository {
    void save();
}
@Repository("userRepository")
public class UserRepositoryImpl implements UserRepository{

    @Autowired(required = false)
    private TestObject testObject;

    @Override
    public void save() {
        System.out.println("UserRepositoryImpl Save()");
        System.out.println(testObject);
    }
}
@Repository
public class UserJdbcRepository implements UserRepository{
    @Override
    public void save() {
        System.out.println("UserJdbcRepository sava...");
    }
}

@Qualifier("userRepositoryImpl")指定要装配的接口的实现类的名字。可以写在属性、setter方法以及setter方法入参前面。

public interface UserRepository {
    void save();
}

@Repository
public class UserRepositoryImpl implements UserRepository{

    @Autowired(required = false)
    private TestObject testObject;

    @Override
    public void save() {
        System.out.println("UserRepositoryImpl Save()");
        System.out.println(testObject);
    }
}

@Repository
public class UserJdbcRepository implements UserRepository{
    @Override
    public void save() {
        System.out.println("UserJdbcRepository sava...");
    }
}

//属性前面
@Service
public class UserService {

    @Autowired
    @Qualifier("userRepositoryImpl")
    private UserRepository userRepository;

    public void add(){
        System.out.println("UserService add...");
        userRepository.save();
    }
}

//属性setter方法前面
@Service
public class UserService {
    
    private UserRepository userRepository;
    @Autowired
    @Qualifier("userRepositoryImpl")
    public void setUserRepository(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public void add(){
        System.out.println("UserService add...");
        userRepository.save();
    }
}

//属性setter方法入参前面
@Service
public class UserService {

    private UserRepository userRepository;
    @Autowired
    public void setUserRepository(@Qualifier("userRepositoryImpl")UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public void add(){
        System.out.println("UserService add...");
        userRepository.save();
    }
}

相关文章

  • Java Spring-组件装配

    元素还会自动注册AutowiredAnnotationBeanPo...

  • 2020-06-23

    今日学习了装配-移动组件、装配-显示和隐藏约束、装配-记住装配约束、装配-阵列组件和装配-镜像组件,已熟练掌握,课...

  • 2.装配bean

    一、使用java配置装配bean 使用@Component注解后,代表该类作为组件类,并告知Spring该类要被实...

  • 基于Java类配置的Bean的装载

    基于Java类配置的Bean的装配 在大多数情况下,通过组件扫描和自动装配实现Spring的自动化配置是更为推荐的...

  • Spring之旅(四):Spring 高级装配(一)

    Bean的高级装配 我们已经学习了Bean的自动装配和java显式装配,但java的装配绝不仅限于此。 我们可能会...

  • Elasticsearch:在 CentOS 7 上安装 Ela

    1. 环境 CentOS 7; JAVA 1.8.0(安装配置 JDK,可参阅《JAVA:CentOS 7 安装配...

  • 01.装配Bean

    使用隐式装配 编写组件 使用隐式装配的流程 编写组件 为需要被管理的类加上 @Component, 可以设置参数 ...

  • Spring装配Bean

    spring三种方式装配bean: 自动化装配bean 借助java来进行bean装配 使用xml进行bean装配...

  • Spring装配

    一、自动装配 @Component:组件类,同类型:@Named@ComponentScan:组件扫描@Autow...

  • CentOS部署OpenStack过程-Dashboard

    CentOS部署OpenStack过程-Dashboard 安装配置组件 安装组件yum install open...

网友评论

    本文标题:Java Spring-组件装配

    本文链接:https://www.haomeiwen.com/subject/ulrlzctx.html