zoukankan      html  css  js  c++  java
  • 注解实现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;
  • 相关阅读:
    微信小程序 'errcode' => 47003,'errmsg' => 'argument invalid! hint
    微信分账
    Acwing-----1016. 最大上升子序列和
    Acwing-----1012. 友好城市
    Acwing-----482. 合唱队形
    Acwing-----1014. 登山
    Acwing-----1017. 怪盗基德的滑翔翼
    Acwing-----275. 传纸条
    Acwing-----1027. 方格取数
    Acwing-----1018. 最低通行费
  • 原文地址:https://www.cnblogs.com/57rongjielong/p/7840585.html
Copyright © 2011-2022 走看看