Spring学习笔记七、自动装配 @Resource(JSR250)和@Inject(JSR330)、 @Autowired(Spring)
程序员文章站
2024-03-24 11:29:34
...
一、配置文件及说明 以及区别说明
package com.hao.config;
import com.hao.dao.BookDAO;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
/**
* @author haoxiansheng
* @date 2020-06-02
* 自动装配:
* spring 利用依赖注入(DI),完成对IOC 容器中各个组件的依赖关系赋值
* 1、{@link org.springframework.beans.factory.annotation.Autowired} spring 定义的
* 1) 默认优先按照类型去容器中找对应的组件:applicationContext.getBean(BookDAO.class)
* 2) 如果找到多个相同类型的主键,在将属性名称作为组件id去容器中查找applicationContext.getBean("bookDAO")
* 3) @Qualifier("booDAO") 明确指定使用的组件id
* 4) 自动装配一定要将属性赋值好,没有就会报错 @Autowired(required = false)
* 5) @Primary: 默认指定首选装配 也可以使用@Qualifier 指定具体需要装配的
* 6) 可以用在:构造方法、参数、方法、属性
* <p>
* 2、Spring 还支持使用@Resource(JSR250)和@Inject(JSR330) java 规范
* 1) @Resource 可以和@Autowired 一样实现自动装配功能,默认是按照组件名称进行装配的。
* 缺点没有支持 @Autowired(required = false) 和 @Primary 功能
* 2)@Inject 和 @Autowired 功能一样但是没有属性
* 需要导入依赖
* <dependency>
* <groupId>javax.inject</groupId>
* <artifactId>javax.inject</artifactId>
* <version>1</version>
* </dependency>
*
* 3、{@link org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor} 做解析功能
*/
@Configuration
@ComponentScan({"com.hao.controller", "com.hao.dao", "com.hao.service"})
public class MainConfigOfAutowired {
/**
* @return
*/
@Primary
@Bean("bookDAO2") // 如果不指定这个 bookDAO2 则启动加载生效的是configuration的bookDAO
public BookDAO bookDAO() {
BookDAO bookDAO = new BookDAO();
bookDAO.setLable("2");
return bookDAO;
}
}
二、测试类
package com.hao.test;
import com.hao.config.MainConfigOfAutowired;
import com.hao.config.MainConfigOfLifeCycle;
import com.hao.controller.BookController;
import com.hao.dao.BookDAO;
import com.hao.service.BookService;
import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
/**
* @author haoxiansheng
* @date 2020-05-29
*/
public class IOCAutowiredTest {
// 测试第一种
@Test
public void test01() {
// 1、传入配置类 创建IOC 容器
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfAutowired.class);
System.out.println("ioc 容器创建完成");
// 获取
BookService bookService = applicationContext.getBean(BookService.class);
System.out.println(bookService.toString());
//BookDAO bookDAO = applicationContext.getBean(BookDAO.class);
//System.out.println(bookDAO.toString());
// 2、关闭容器
applicationContext.close();
}
}
package com.hao.dao;
import org.springframework.stereotype.Repository;
/**
* @author haoxiansheng
* @date 2020-05-28
*/
// 名字默认是类名首字母小写
@Repository
public class BookDAO {
private String lable = "1";
public void insert() {
System.out.println("我是BookDAO 做一些操作");
}
public String getLable() {
return lable;
}
public void setLable(String lable) {
this.lable = lable;
}
@Override
public String toString() {
return "BookDAO{" +
"lable='" + lable + '\'' +
'}';
}
}
package com.hao.service;
import com.hao.dao.BookDAO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.inject.Inject;
/**
* @author haoxiansheng
* @date 2020-05-28
*/
@Service
public class BookService {
//@Qualifier("bookDAO")
//@Autowired()
//@Resource(name = "bookDAO2")
@Inject
private BookDAO bookDAO;
public void create() {
System.out.println("我是service 做一些操作");
}
@Override
public String toString() {
return "BookService{" +
"bookDAO=" + bookDAO +
'}';
}
}
上一篇: Flex菜单弹跳效果
下一篇: 纵向的走马灯,有停顿效果