zoukankan      html  css  js  c++  java
  • spring依赖注入

    讲spring的依赖注入先要讲到的是java的反射机制:

    java的反射机制:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

      二,反射机制的作用:

                  1,反编译:.class-->.java

                  2,通过反射机制访问java对象的属性,方法,构造方法等;

                 这样好像更容易理解一些,下边我们具体看怎么实现这些功能。

     

          三,在这里先看一下sun为我们提供了那些反射机制中的类:

    java.lang.Class;                

    java.lang.reflect.Constructor; java.lang.reflect.Field;        

    java.lang.reflect.Method;

    java.lang.reflect.Modifier;

                很多反射中的方法,属性等操作我们可以从这四个类中查询。还是哪句话要学着不断的查询API,那才是我们最好的老师。

     

             四,具体功能实现:

                    1,反射机制获取类有三种方法,我们来获取Employee类型

    1. //第一种方式:  
    2. Classc1 = Class.forName("Employee");  
    3. //第二种方式:  
    4. //java中每个类型都有class 属性.  
    5. Classc2 = Employee.class;  
    6.    
    7. //第三种方式:  
    8. //java语言中任何一个java对象都有getClass 方法  
    9. Employeee = new Employee();  
    10. Classc3 = e.getClass(); //c3是运行时类 (e的运行时类是Employee)  

        2,创建对象:获取类以后我们来创建它的对象,利用newInstance

    1. Class c =Class.forName("Employee");  
    2.   
    3. //创建此Class 对象所表示的类的一个新实例  
    4. Objecto = c.newInstance(); //调用了Employee的无参数构造方法.  



        3,获取属性:分为所有的属性和指定的属性:

          a,先看获取所有的属性的写法:

    1. //获取整个类  
    2.             Class c = Class.forName("java.lang.Integer");  
    3.               //获取所有的属性?  
    4.             Field[] fs = c.getDeclaredFields();  
    5.        
    6.                    //定义可变长的字符串,用来存储属性  
    7.             StringBuffer sb = new StringBuffer();  
    8.             //通过追加的方法,将每个属性拼接到此字符串中  
    9.             //最外边的public定义  
    10.             sb.append(Modifier.toString(c.getModifiers()) + " class " + c.getSimpleName() +"{ ");  
    11.             //里边的每一个属性  
    12.             for(Field field:fs){  
    13.                 sb.append(" ");//空格  
    14.                 sb.append(Modifier.toString(field.getModifiers())+" ");//获得属性的修饰符,例如public,static等等  
    15.                 sb.append(field.getType().getSimpleName() + " ");//属性的类型的名字  
    16.                 sb.append(field.getName()+"; ");//属性的名字+回车  
    17.             }  
    18.       
    19.             sb.append("}");  
    20.       
    21.             System.out.println(sb);  


           b,获取特定的属性,对比着传统的方法来学习:

    1. public static void main(String[] args) throws Exception{  
    2.               
    3. <span style="white-space:pre">  </span>//以前的方式:  
    4.     /* 
    5.     User u = new User(); 
    6.     u.age = 12; //set 
    7.     System.out.println(u.age); //get 
    8.     */  
    9.               
    10.     //获取类  
    11.     Class c = Class.forName("User");  
    12.     //获取id属性  
    13.     Field idF = c.getDeclaredField("id");  
    14.     //实例化这个类赋给o  
    15.     Object o = c.newInstance();  
    16.     //打破封装  
    17.     idF.setAccessible(true); //使用反射机制可以打破封装性,导致了java对象的属性不安全。  
    18.     //给o对象的id属性赋值"110"  
    19.     idF.set(o, "110"); //set  
    20.     //get  
    21.     System.out.println(idF.get(o));  
    22. }  

      

       这样我们就可以获得类的各种内容,进行了反编译。对于JAVA这种先编译再运行的语言来说,反射机制可以使代码更加灵活,更加容易实现面向对象

        当然了,JAVA中其实也是一样,只不过这里的配置文件为.properties,称作属性文件。通过反射读取里边的内容。这样代码是固定的,但是配置文件的内容我们可以改,这样使我们的代码灵活了很多!

            综上为,JAVA反射的再次学习,灵活的运用它,能够使我们的代码更加灵活,但是它也有它的缺点,就是运用它会使我们的软件的性能降低,复杂度增加,所以还要我们慎重的使用它。

    spring的依赖注入

    spring的依赖注入最主要的方法有两种  set注入和构造函数注入

    先来介绍一下set注入

    package com.bjsxt.model;
    
    public class User {
        private String username;
        private String password;
        public String getUsername() {
            return username;
        }
        public void setUsername(String username) {
            this.username = username;
        }
        public String getPassword() {
            return password;
        }
        public void setPassword(String password) {
            this.password = password;
        }
    }

    接口

    package com.bjsxt.dao;
    import com.bjsxt.model.User;
    
    
    public interface UserDAO {
        public void save(User user);
    }

    实现接口

    package com.bjsxt.dao.impl;
    
    import com.bjsxt.dao.UserDAO;
    import com.bjsxt.model.User;
    
    
    public class UserDAOImpl implements UserDAO {
    
        public void save(User user) {
            //Hibernate
            //JDBC
            //XML
            //NetWork
            System.out.println("user saved!");
        }
    
    }

    service

    package com.bjsxt.service;
    import com.bjsxt.dao.UserDAO;
    import com.bjsxt.model.User;
    
    
    
    public class UserService {
        
        private UserDAO userDAO;  
        public void add(User user) {
            userDAO.save(user);
        }
        public UserDAO getUserDAO() {
            return userDAO;
        }
        public void setUserDAO(UserDAO userDAO) {
            this.userDAO = userDAO;
        }
        
        public UserService(UserDAO userDAO) {
            super();
            this.userDAO = userDAO;
        }
    }

    beans.xml中

    <bean id="u" class="com.bjsxt.dao.impl.UserDAOImpl">
      </bean>
        
      <bean id="userService" class="com.bjsxt.service.UserService">
      
          <property name="userDAO" ref="u" />
        </bean>


    测试类

    package com.bjsxt.service;
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    import com.bjsxt.model.User;
    
    //Dependency Injection
    //Inverse of Control
    public class UserServiceTest {
    
        @Test
        public void testAdd() throws Exception {
            ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
            
            
            UserService service = (UserService)ctx.getBean("userService");
            
            
            User u = new User();
            u.setUsername("zhangsan");
            u.setPassword("zhangsan");
            service.add(u);
        }

    下面是构造器注入

    beans.xml中

     <bean id="u" class="com.bjsxt.dao.impl.UserDAOImpl">
      </bean>
        
      <bean id="userService" class="com.bjsxt.service.UserService">
             <constructor-arg>
                           <ref bean="u"/>
           </constructor-arg>
      </bean>
  • 相关阅读:
    并不对劲的loj3124:uoj477:p5405:[CTS2019]氪金手游
    并不对劲的loj6498. 「雅礼集训 2018 Day2」农民
    并不对劲的loj2251:p3688[ZJOI2017]树状数组
    并不对劲的loj2050:p3248:[HNOI2016]树
    并不对劲的BJOI2020
    并不对劲的loj3110:p5358:[SDOI2019]快速查询
    并不对劲的loj3111:p5359:[SDOI2019]染色
    (困难) CF 484E Sign on Fence,整体二分+线段树
    算法录 之 拓扑排序和欧拉路径。
    数据结构录 之 BST的高级应用。
  • 原文地址:https://www.cnblogs.com/ouzilin/p/4979270.html
Copyright © 2011-2022 走看看