注解实现IOC和DI
Posted 57容杰龙
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了注解实现IOC和DI相关的知识,希望对你有一定的参考价值。
1.组件扫描
Spring3.0后为我们引入了组件自动扫描机制,它可以在类路径底下寻找标注了@Component、@Service、@Controller、@Repository注解的类,并把这些类纳入进spring容器中管理。它的作用和在xml文件中使用bean节点配置组件是一样的。
A.开启注解扫描:base-package为需要扫描的包(含子包)
<context:component-scan base-package="com.web"></context:component-scan>
B.在组件bean上定义类注解,在组件bean的依赖属性上,定义依赖注解
/**
* spring 注解扫描演示 bean
* @Component:通用组件
* @Scope : 设置组件的作用域
* prototype:该模式下会每次getBean都创建一个对象,并且都是延迟加载的
* @Lazy:设置组件是否延迟加载
* true为延迟加载 false为容器创建则立即加载bean
* @PostConstruct: 初始化方法注解
* @PreDestroy: 销毁方法注解
* @author Administrator
*/
1 @Component 2 //@Scope("prototype") 3 @Lazy(true) 4 public class ExampleBean { 5 6 public ExampleBean(){ 7 System.out.println("ExampleBean 无参构造被调用。。。。。。"); 8 } 9 10 11 @PostConstruct 12 public void init(){ 13 System.out.println("ExampleBean 初始化方法调用....."); 14 } 15 16 @PreDestroy 17 public void destroy(){ 18 System.out.println("ExampleBean 销毁方法调用......"); 19 } 20 21 22 }
注解下的类扫描和依赖注入
依赖关系的注解:
注意:
a.此类注解可以在属性上面设置,也可以在set方法上面设置
b.一般用于属性上,因为注解实现下set方法是可以省略不写的
c.下面的多个依赖注解,只需要使用一个Resource即可
/** * Dao访问数据库 * @Repository:设置数据访问层的类级别注解 * @Resource: 用于引用类型属性的值注入 spring会先按属性名字从容器中查找是否有适合的bean * 如果找不到,再按照类型查找是否有适合的bean,如果找到bean则注入进去, * 如果找不到合适的bean,就会报bean不存在的异常 建议还是遵从默认规则 * name属性可以用于指定查找的bean的名字 * * @author Administrator * */ @Repository public class EmpDaoImpl implements EmpDao{ @Resource/*(name="DbUtil")*/ private DbUtil dbUtil;//通过dbUtil 获取数据库连接
/** * @Service :服务层的类级别注解 * @Autowired: 按照类型先查找,再按照名字找(避免两个同类型的bean的问题) * @Qualifier("empDaoImpl") :指定容器查找的bean的名字 * @author Administrator * */ @Service public class EmpServiceImpl implements EmpService{ @Autowired @Qualifier("empDaoImpl") EmpDao empDao;//spring 容器中有EmpDaoImpl的对象存在,父类引用指向子类对象
1 /* 2 * 3 * 4 * @Value: 用于注解注入值,可以给基本类型和字符串类型直接赋值 可以写在属性上,也可以写在setter上 5 * 依赖注入注解下,省略setter方法,直接将注解写在属性上即可 6 */ 7 @Component("DbUtil") 8 public class DbUtil { 9 //从配置文件中找到driver对应的值 10 @Value("#{props.driver}") 11 private String driver; 12 private String username; 13 @Value("#{props.password}") 14 private String password; 15 @Value("#{props.url}") 16 private String url; 17 public void setDriver(String driver) { 18 try { 19 Class.forName(driver);//加载驱动 20 } catch (ClassNotFoundException e) { 21 // TODO Auto-generated catch block 22 e.printStackTrace(); 23 } 24 this.driver = driver; 25 } 26 27 28 @Value("#{props.username}") 29 public void setUsername(String username) { 30 this.username = username; 31 } 32 33 34 35 36 }
<util:properties id="props" location="classpath:db.properties"></util:properties>
1 /** 2 * @Controller: 设置控制层的类级别注解 3 * @Inject:标准注解,属于通用注解,该注解功能不属于spring的 4 * 用于设置属性注入,并且可以通过@Named指定从spring容器中查找的bean的名字 5 * @author Administrator 6 * 7 */ 8 @Controller 9 public class EmpController { 10 @Inject 11 EmpService empServiceImpl;
以上是关于注解实现IOC和DI的主要内容,如果未能解决你的问题,请参考以下文章