@Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上。
@Autowired默认按类型装配(这个注解是属于spring的),默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false,如:@Autowired(required=false) 。如果我们想使用名称装配可以结合@Qualifier注解进行使用,如下:
使用@Autowired注释进行byType注入,如果需要byName(byName就是通过id去标识)注入,增加@Qualifier注释。
@Qualifier
一般在候选Bean数目不为1时应该加@Qualifier注释。
在默认情况下使用 @Autowired 注释进行自动注入时,Spring 容器中匹配的候选 Bean 数目必须有且仅有一个。当找不到一个匹配的 Bean 时,Spring 容器将抛BeanCreationException 异常,并指出必须至少拥有一个匹配的 Bean。
和找不到一个类型匹配 Bean 相反的一个错误是:如果 Spring 容器中拥有多个候选 Bean,Spring 容器在启动时也会抛出 BeanCreationException 异常。
public class UserController {
@Autowired
private Userservice userservice;
public void execute(){
System.out.println("user controlling");
userservice.add();
}
}
业务层:
public class Userservice {
private UserRepository userRepository;
@Autowired
@Qualifier("userRepositoryJDBC")
public void setUserRepository(UserRepository userRepository) {
this.userRepository = userRepository;
}
public void add()
{
System.out.println("UserService add...");
userRepository.save();
}
}
持久层:
public interface UserRepository {
void save();
}
@Repository
public class UserRepositoryImpl implements UserRepository {
@Override
public void save() {
System.out.println("userepository saving。。。");
}
}
@Repository
public class UserRepositoryJDBC implements UserRepository {
@Override
public void save() {
System.out.println("jdbc saving...");
}
}
TestObject:
@Component
public class TestObject {
}
beans-annotation.xml
<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.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan
base-package="com.spring.annotation" > context:component-scan>
beans>
在父类建立依赖关系,子类只要继承了它们,就能够建立相应的依赖关系。
BaseRepository
public class BaseRepository {
}
BaseService
public class BaseService {
//在父类中建立依赖关系
@Autowired
protected BaseRepository repository;
public void add(){
System.out.println("adding...");
System.out.println(repository);
}
}
User
public class User {
}
UserRepository
@Repository
public class UserRepository extends BaseRepository<User> {
}
UserService
@Service
public class UserService extends BaseService<User> {
}
注入的泛型类型要匹配,并都要继承父类,子类之间才会自动继承父类的依赖关系,调用父类的方法时才会用具体的子类类型替代
Main
public class Main {
public static void main(String[] args) {
ClassPathXmlApplicationContext actxt = new ClassPathXmlApplicationContext("beans-generic.xml");
UserService us = (UserService) actxt.getBean("userService");
us.add();
}
}
打印:
信息: Loading XML bean definitions from class path resource [beans-generic.xml]
adding...
com.spring.generic.UserRepository@15bfd87