Spring调用spymemcached客户端的例子,才可以在Action中使用依赖注入
分类:面向对象

import  org.springframework.web.*;

ssh中整合,为什么将Action交由Spring托管,才可以在Action中使用依赖注入!
ssh中整合,为什么将Action交由Spring托管,才可以在Action中使用依赖注入!

转载:Spring调用spymemcached客户端的例子

spymemcached客户端API:spymemcached client 
网址: 

建立一个Client类来获得MemcachedClient的实例: 
Client.java 

Java代码  图片 1

  1. package bcndyl.test;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import net.spy.memcached.AddrUtil;  
  6. import net.spy.memcached.MemcachedClient;  
  7.   
  8. public class Client {  
  9.       
  10.     private String str;  
  11.   
  12.     public String getStr() {  
  13.         return str;  
  14.     }  
  15.   
  16.     public void setStr(String str) {  
  17.         this.str = str;  
  18.     }  
  19.       
  20.     public MemcachedClient getMClient() throws IOException{  
  21.             return new MemcachedClient(AddrUtil.getAddresses(str));  
  22.     }  
  23.       
  24. }  

建立操作memcached的测试类: 
StringTest.java 

Java代码  图片 2

  1. package bcndyl.test;  
  2.   
  3. import net.spy.memcached.MemcachedClient;  
  4.   
  5. import org.springframework.context.ApplicationContext;  
  6. import org.springframework.context.support.FileSystemXmlApplicationContext;  
  7.   
  8. public class StringTest {  
  9.       
  10.     public static void main(String[] args) throws Exception{  
  11.         ApplicationContext ctx=new FileSystemXmlApplicationContext("src/applicationContext.xml");  
  12.         for(int i=0; i<250; i++){  
  13.             Client b = (Client)ctx.getBean("client");  
  14.             MemcachedClient mc = b.getMClient();  
  15.             mc.set("key"+i, 3600, "hello");  
  16.         }  
  17.     }  
  18.   
  19. }  

spring的配置文件为: 

Xml代码  图片 3

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans  
  3.     xmlns=""  
  4.     xmlns:xsi=""  
  5.     xsi:schemaLocation=" ;  
  6.   
  7.     <bean id="client" class="bcndyl.test.Client">  
  8.         <property name="str">  
  9.             <value>192.168.227.20:12111</value>  
  10.         </property>  
  11.     </bean>  
  12.   
  13. </beans>  

配置中不是向程序中直接注入MemcachedClient,而是通过向Client类中注入memcached服务器地址的方式之后再new出来一个MemcachedClient,如果有多个memcached服务器就输入多个地址的String值(如:“192.168.227.20:12111 192.168.227.21:12111”),不知道这样写符不符合spring的思想。

   spring框架的原理其实主要是dom4j+反射+xml.原理就是将xml用dmo4j解析,然后取出xml中的元素赋值到实体类中,实体类用反射机制获取其中的属性。下面具体来说明一下。

public  IpText{

传统正确的整合方式:

首先创建一个UserEntity的实体类.

       public  static  void  main(String args[]){
          BeanFactory bf = new ClassPathXmlApplicationContext("applicationContext.xml");

struts-config.xml:

第一步:创建一个实体类

          Object  b  = bf.getBeans("Name);

<struts-config>

<?xml version="1.0" encoding="UTF-8"?>
<beans>
 <bean id="user1" class="entity.UserEntity">
  <property name="userId" value="0001"></property>
  <property name="userName" value="余胜军"></property>
 </bean>
 <bean id="user2" class="entity.UserEntity">
  <property name="userId" value="0002"></property>
  <property name="userName" value="张三"></property>
 </bean>
</beans>

          System.out.println(b.toString());

<data-sources>

第二步:手写一个简单的xml

         }

<form-beans>

<?xml version="1.0" encoding="UTF-8"?> 
<students> 
    <student1 id="001"> 
        <简书>@听风_与你</简书> 
        <学号>20140101</学号> 
        <地址>上海市浦东新区世纪大道</地址> 
        <座右铭>要么强大,要么听话</座右铭> 
    </student1> 
    <student2 id="002"> 
        <简书>@听风_与你</简书> 
        <学号>20140102</学号> 
        <地址>上海市浦东新区世纪大道</地址> 
        <座右铭>自信不自大,失败不气馁,倒了爬起来</座右铭> 
    </student2> 
</students>

}

<form-bean name="loginForm" type="com.yourcompany.struts.form.LoginForm">

第三步:创建一个解析xml并且反射将值赋值的类。

applicationContext.xml

</form-beans>

package classForm;

<beans>

<action-mappings>

import java.lang.reflect.Field;
import java.util.List;

<bean  id=""  class=""  scope="">

<action <br=""> attribute="loginForm"

import org.apache.commons.lang.StringUtils;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

   <property  name=""  value=""/>

input="/form/login.jsp"

import entity.UserEntity;

</bean>

name="loginForm"

public class ClassPathXmlApplicationContext {
 private String xmlPath;

</beans>

path="/login"

 public ClassPathXmlApplicationContext(String xmlPath) {
  this.xmlPath = xmlPath;
 }

//以上是spring的使用步骤 不知道我这正确吗?请各位大侠请教

scope="request"

 public Object getBean(String beanId) throws Exception {
  // 解析xml器
  SAXReader saxReader = new SAXReader();
  Document read = null;
  try {
   // 从项目根目录路径下 读取
   read = saxReader.read(this.getClass().getClassLoader()
     .getResourceAsStream(xmlPath));
  } catch (Exception e) {
   e.printStackTrace();
  }
  if (read == null) {
   return null;
  }
  // 获取根节点资源
  Element root = read.getRootElement();
  List<Element> elements = root.elements();
  if (elements.size() <= 0) {
   return null;
  }
  Object oj = null;
  for (Element element : elements) {
   String id = element.attributeValue("id");
   if (StringUtils.isEmpty(id)) {
    return null;
   }
   if (!id.equals(beanId)) {
    continue;
    // throw new Exception("使用beanId:" + beanId + ",未找到该bean");
   }
   // 获取实体bean class地址
   String beanClass = element.attributeValue("class");
   // 使用反射实例化bean
   Class<?> forNameClass = Class.forName(beanClass);
   oj = forNameClass.newInstance();
   // 获取子类对象
   List<Element> attributes = element.elements();
   if (attributes.size() <= 0) {
    return null;
   }
   for (Element et : attributes) {
    // 使用反射技术为方法赋值
    String name = et.attributeValue("name");
    String value = et.attributeValue("value");
    Field field = forNameClass.getDeclaredField(name);
    field.setAccessible(true);
    field.set(oj, value);

 

type="org.springframework.web.struts.DelegatingActionProxy"> //使用代理

   }

<forward name="show" path="/show.jsp">

  }
  return oj;
  // 1.使用beanId查找配置文件中的bean。
  // 2.获取对应bean中的classpath配置
  // 3.使用java反射机制实体化对象Class
 }
 
 public static void main(String[] args) throws Exception {
  ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext(
    "applicationContext.xml");
  UserEntity bean = (UserEntity) applicationContext.getBean("user2");
  System.out.println("使用反射获取bean" + bean.getUserId() + "---" + bean.getUserName());

</action>

 }
}

</action-mappings>

当然这是最简单的手写spring.这是原理.希望各位有什么好建议提出来,虚心求教。

<message-resources parameter="com.yourcompany.struts.ApplicationResources">

<plug-in classname="org.springframework.web.struts.ContextLoaderPlugIn">

<set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml">

</plug-in>

</struts-config>

applicationContext.xml:

<beans>

<bean >

<bean name="/login" >

<property name="personDAO" ref="personDAO">

</property>

</bean>

</beans>

web.xml:

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>/WEB-INF/applicationContext*.xml</param-value>

</context-param>

<listener>

<listener-class>org.springframwork.web.content.ContextLoaderListener</listener-class>

</listener>

这样一来:我想在action里面注入server,只要在action里面

privaet PersonDAO personDAO;

public PersonDAO getPersonDAO() {

return personDAO;

}

public void setPersonDAO(PersonDAO personDAO) {

this.personDAO = personDAO;

}

就可以拿到personDAO对象想干吗就干吗了。。

我的问题是:

我前几天一个不小心有个问题没弄明白:为什么将Action交由Spring托管,才可以在Action中使用依赖注入!

我的:

struts-config.xml:

<action-mappings>

<action <br=""> attribute="loginForm"

input="/form/login.jsp"

name="loginForm"

path="/login"

scope="request"

type="com.yourcompany.struts.action.LogAction"> //不使用代理

<forward name="show" path="/show.jsp">

</action>

applicationContext.xml:

<beans>

<bean >

<bean name="/login" > //就象和<bean >一样<property name="personDAO" ref="personDAO">

</property>

</bean>

</beans>

然后在action里面

privaet PersonDAO personDAO;

..get居然拿到的personDAO是空。为什么??

为什么:<bean >直接在spring里面直接写可以,而action非要托管才能注入,不能象server啊 dao之类的直接在applicationContext.xml里面写配置。

请大家教下我,谢谢了!

本文由10bet手机官网发布于面向对象,转载请注明出处:Spring调用spymemcached客户端的例子,才可以在Action中使用依赖注入

上一篇:没有了 下一篇:没有了
猜你喜欢
热门排行
精彩图文