注解实现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;
原文地址:https://www.cnblogs.com/57rongjielong/p/7840585.html