码迷,mamicode.com
首页 > 编程语言 > 详细

spring依赖注入

时间:2015-11-19 23:54:53      阅读:257      评论:0      收藏:0      [点我收藏+]

标签:

讲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() +"{\n");  
  11.             //里边的每一个属性  
  12.             for(Field field:fs){  
  13.                 sb.append("\t");//空格  
  14.                 sb.append(Modifier.toString(field.getModifiers())+" ");//获得属性的修饰符,例如public,static等等  
  15.                 sb.append(field.getType().getSimpleName() + " ");//属性的类型的名字  
  16.                 sb.append(field.getName()+";\n");//属性的名字+回车  
  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>

 

spring依赖注入

标签:

原文地址:http://www.cnblogs.com/ouzilin/p/4979270.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!