Java

Java Spring-组件装配

2020-01-18  本文已影响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();
    }
}
上一篇 下一篇

猜你喜欢

热点阅读