1. HelloWorld
- * 引入依赖
- * 开启组件扫描
- * 使用注解定义 Bean
- * 依赖注入
2.开启组件扫描
<?xml version="1.0" encoding="UTF-8"?>
<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-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--开启组件扫描功能-->
<!--<context:component-scan base-package="com.itgyl.bean"></context:component-scan>-->
<context:component-scan base-package="com.itgyl.bean"></context:component-scan>
</beans>
3.创建bean
@Component//该注解效果等同于<bean id="user" class="...">如果写value创建bean对象值默认使用开头字母为小写的类名
public class User {
}
4.完成依赖注入
@Test
public void testUser() {
ApplicationContext context =
new ClassPathXmlApplicationContext("bean.xml");
System.out.println(context);
//获取bean时会自动完成依赖注入
User user = context.getBean(User.class);
System.out.println(user);
}
2. @Autowire注入
2.1 根据属性自动注入
以MVC架构模式为栗
@Controller
public class UserController {
/***
* 1.根据属性自动注入
*/
@Autowired //根据类型找到对应对象完成自动注入
private UserService userService;
public void show() {
userService.show();
System.out.println("controller...");
}
}
@Service
public class UserServiceImp implements UserService{
/***
* 1.根据属性完成自动注入
*/
@Autowired //该注解会通过类型找到对应的对象完成注入
private UserDao userDao;
@Override
public void show() {
userDao.show();
System.out.println("userService...");
}
}
@Repository
public class UserDaoImp implements UserDao{
@Override
public void show() {
System.out.println("userDao...");
}
}
基于全注解配置IoC容器,把xml的配置文本用类来代替
@Configurable //基于全注解创建IoC容器配置一个类,该类加上两个注解,注解@Configurable即该类为配置类
@ComponentScan("com.itgyl.autowired") //@ComponentScan注解里面的路径即从哪个包开始扫描自动注入bean
public class SpringConfig {
}
public class TestAutoWired {
public static void main(String[] args) {
ApplicationContext context =
new AnnotationConfigApplicationContext(SpringConfig.class);
UserController userController = context.getBean(UserController.class);
userController.show();
}
}
2.2 根据set方法自动注入
/***
* 2.根据set方法自动注入
*/
@Autowired
public void setUserService(UserService userService) {
this.userService = userService;
}
/***
* 2.根据set方法完成自动注入
*/
@Autowired
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
2.3 根据构造器自动注入
/***
* 3.根据构造器完成自动注入
*/
@Autowired
public UserController(UserService userService) {
this.userService = userService;
}
/***
* 3.根据构造器完成自动注入
*/
@Autowired
public UserServiceImp(UserDao userDao) {
this.userDao = userDao;
}
2.4 通过形参自动注入
/***
* 4.通过形参注入
*/
public UserController(@Autowired UserService userService) {
this.userService = userService;
}
/***
* 4.通过形参注入
*/
@Autowired
public UserServiceImp(@Autowired UserDao userDao) {
this.userDao = userDao;
}
2.5 通过@AutoWire和@Qualifier注解完成注入
@Autowired
@Qualifier(value = "userServiceImp") //默认名字为开头首字母小写的类的名字
private UserService userService;
@Autowired
@Qualifier(value = "userDaoImp")
private UserDao userDao;
总结
**总结**
* @Autowired注解可以出现在:属性上、构造方法上、构造方法的参数上、setter方法上。
* 当带参数的构造方法只有一个,@Autowired注解可以省略。()
* @Autowired注解默认根据类型注入。如果要根据名称注入的话,需要配合@Qualifier注解一起使用。
3. @Resource注入
3.1 根据name注入
@Controller
public class UserController {
//@Resource注解即该实例化对象源于哪name的值要和传递的实例化对象保持一致
//指定值接收就按照该值找相应的实例化bean
@Resource(name = "myUserService")
private UserService userService;
public void show() {
userService.show();
System.out.println("controller...");
}
}
3.2 无name值注入
//@Service中value的值即要传递的实例化对象,接收时的值要和该值保持一致
@Service(value = "myUserService")
public class UserServiceImp implements UserService {
//@Resource此时不指定name的值则使用属性中的变量名和传递的bean实例化对象相匹配,要求该属性名和值保持一致
//当@Resource注解使用时没有指定name的时候,还是根据name进行查找,这个name是属性名。
@Resource
private UserDao myUserDaoImp;
@Override
public void show() {
myUserDaoImp.show();
System.out.println("userService...");
}
}
@Repository("myUserDaoImp")
public class UserDaoImp implements UserDao {
@Override
public void show() {
System.out.println("userDao...");
}
}
@Configurable
@ComponentScan("com.itgyl.resource")
public class SpringConfig {
}
public class TestResource {
public static void main(String[] args) {
//通过全注解方式获取管理对象的IoC容器
ApplicationContext context =
new AnnotationConfigApplicationContext(SpringConfig.class);
UserController u = context.getBean(UserController.class);
u.show();
}
}
总结
总结:**
@Resource注解:默认byName注入,没有指定name时把属性名当做name,根据name找不到时,才会byType注入。byType注入时,某种类型的Bean只能有一个