使用 @Autowired 自动装配 Bean
@Autowired 注解自动装配具有兼容类型的单个 Bean属性
构造器, 普通字段(即使是非 public), 一切具有参数的方法都可以应用@Authwired 注解
默认情况下, 所有使用 @Autowired 注解的属性都需要被设置. 当 Spring 找不到匹配的 Bean 装配属性时, 会抛出异常, 若某一属性允许不被设置, 可以设置 @Autowired 注解的 required 属性为 false
默认情况下, 当 IOC 容器里存在多个类型兼容的 Bean 时, 通过类型的自动装配将无法工作. 此时可以在 @Qualifier 注解里提供 Bean 的名称. Spring 允许对方法的入参标注 @Qualifiter 已指定注入 Bean 的名称
@Autowired 注解也可以应用在数组类型的属性上, 此时 Spring 将会把所有匹配的 Bean 进行自动装配.
@Autowired 注解也可以应用在集合属性上, 此时 Spring 读取该集合的类型信息, 然后自动装配所有与之兼容的 Bean.
@Autowired 注解用在 java.util.Map 上时, 若该 Map 的键值为 String, 那么 Spring 将自动装配与之 Map 值类型兼容的 Bean, 此时 Bean 的名称作为键值
package com.learn.spring.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import com.learn.spring.service.UserService;
/**
* 表现层的组件
*
* @Controller的作用:
* 等价于在xml配置文件中: <bean id="userController" class="com.learn.spring.controller.UserController"></bean>
* @Controller注解默认的id值是类名首字母小写,如果想要自己指定,可以使用value属性来指定
* @Controller(value="id") / @Controller("id")
*/
@Controller
//@Component
public class UserController {
@Autowired(required=false) // 默认情况下,required=true,代表@AutoWired标注的属性必须被装配.
//可以改为required=false,有就装配,没有就算了.
private UserService userService ;
public void login(){
System.out.println("UserController login .....");
userService.Handlelogin();
}
}
package com.learn.spring.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import com.learn.spring.dao.UserDao;
/**
* 业务层的组件
*
*/
@Service
public class UserService {
/**
*@AutoWired 优先采用类型的匹配的方式进行bean的装配. 如果有多个类型兼容的bean匹配了,会使用
* 属性名 与bean的id值进行匹配.
*/
@Autowired
@Qualifier("userDaoMyBatisImpl") //进一步的指定要装配的bean的id值.
private UserDao userDao ;
public void Handlelogin(){
System.out.println("UserService handleLogin ....");
//处理登录的逻辑
userDao.getUserByUsernameAndPassword();
}
}
package com.learn.spring.dao;
public interface UserDao {
public void getUserByUsernameAndPassword();
}
package com.learn.spring.dao;
import org.springframework.stereotype.Repository;
@Repository
public class UserDaoMyBatisImpl implements UserDao{
public void getUserByUsernameAndPassword(){
System.out.println("UserDaoMyBatisImpl getUserByUsernameAndPassword......");
}
}