Springメモの整理

43922 ワード

IOC概念解析
iocシンプルコード例IMessge.java
    public interface IMessage {
        public abstract String getMessage();
        }
Message.java
public class Message implements IMessage {
    @Override
    public String getMessage() {
    return "Hello World!";
    }
}
NewMessage.java
public class NewMessage implements IMessage {
        @Override
        public String getMessage() {
            return "Hello Every One!";
        }
    }
message.properties
    1=com.alyshen.spring.Message
    2=com.alyshen.spring.NewMessage
Message Factory.java
    public class MessageFactory {
    
        public static IMessage create(String key) {
    
    //      if ("1".equals(key)) {
    //          //         
    //          return new Message();
    //      }
    //      
            //       
            ResourceBundle bundle = ResourceBundle.getBundle("message");
            String _class = bundle.getString(key);
            try {
                return (IMessage) Class.forName(_class).newInstance();
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
            return null;
        }
    }
MainClass.java
    public class MainClass {
    
        public static void main(String[] args) {
            //       Message   
            // Message msg = new Message();
            
            //       Message       
            // IMessage msg = new Message();
    
            IMessage msg = MessageFactory.create("1");
            System.out.println(msg.getMessage());
    
            msg = MessageFactory.create("2");
            System.out.println(msg.getMessage());
        }
    }
Spring環境配置及びIOC工場応用
使用するカバンと書類
書類に包む
説明
appication Contect.xml
Springプロファイル
spring-context-3.2.0.M 1.jar
主にbean工場の実現類を提供します.工場は中にありますが、インターフェースはspring-beans-3.0.M 1.jarの中にあります.
spring-beans-3.20.M 1.jar
bean工場は中にあります
spring-coree-3.0.M 1.jar
Springコアバッグ
spring-expressition n-3.2.0.M 1.jar
spring表現に対応する
spring-asm-3.20.M 1.jar
いくつかのクラス(バイトコードを動的に生成するクラス)を動的に生成する.
commons-loging-11.jar
依存パケット(公的ログパッケージ)
spring配置ファイル:appication Contact.xml



    
    
スプリングを使ったbean工場
public class MainClass {
    public static void main(String[] args) {
    //   spring  bean  
    BeanFactory factory = new ClassPathXmlApplicationContext(
    "applicationContext.xml");
    //      
    // BeanFactory factory = new ClassPathXmlApplicationContext("app*.xml");

    IMessage msg = (IMessage) factory.getBean("msg1");
    System.out.println(msg.getMessage());

    //      bean  
    msg = MessageFactory.create("2");
    System.out.println(msg.getMessage());
    }
}
Spring依存注入の基本的な方法
セット方法注入例UserManager.java
public class UserManager {
    //   set    
    private String driverCalss;
    private String url;
    private String username;
    private String password;

    public void addUser() {
        System.out.println(this.toString());
        System.out.println("    _    !");
    }

    public void setDriverCalss(String driverCalss) {
        this.driverCalss = driverCalss;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    @Override
    public String toString() {
        return "UserManager [driverCalss=" + driverCalss + ", url=" + url
        + ", username=" + username + ", password=" + password + "]";
    }
}
UserAction.java
public class UserAction {
    private UserManager manager = null;

    public void setManager(UserManager manager) {
    System.out.println("    manager set    !");
    this.manager = manager;
    }

    public String execute() {
    this.manager.addUser();
    return "success";
    }
}
spring配置ファイル:appication Contact.xml



    
        
        
        

        
        
        
        
        
        
    
MainClass.java
    public static void main(String[] args) {
    
        //   spring  bean  
        BeanFactory factory = new ClassPathXmlApplicationContext(
                "applicationContext.xml");
        // BeanFactory factory = new ClassPathXmlApplicationContext("app*.xml");
    
        UserAction ua = (UserAction) factory.getBean("userAction");
        System.out.println(ua.execute());
    }
Scrope属性とBenFactoryAwareインターフェース
UserManager.java
public class UserManager {

    //   set    
    private String driverCalss;
    private String url;
    private String username;
    private String password;

    public void addUser() {
        System.out.println("    _    !");
    }
    //  set get  
    ……
}
UserAction.java
/**
*     BeanFactoryAware
*/
public class UserAction implements BeanFactoryAware {
    private UserManager manager = null;

    public void setManager(UserManager manager) {
        // System.out.println("    manager set    !");

        this.manager = manager;
    }

    public String execute() {
        //             bean      ,    
        // BeanFactory factory = 
        //      new ClassPathXmlApplicationContext("applicationcontext.xml");

        //                   :
        //        
        manager = (UserManager) factory.getBean("userManager");

        System.out.println(manager);
        this.manager.addUser();
        return "success";
    }

    BeanFactory factory = null;

    @Override
    public void setBeanFactory(BeanFactory factory) throws BeansException {
        // TODO Auto-generated method stub
        this.factory = factory;
    }
}
appication Contect.xml



    
    
        
    

    
        
        
        
        
        
    
MainClass.java
public static void main(String[] args) {
    // UserAction userAction = new UserAction();
    // UserManager manager = new UserManager();
    // userAction.setManager(manager);

    //   spring  bean  
    // BeanFactory factory = new ClassPathXmlApplicationContext("app*.xml");
    BeanFactory factory = new ClassPathXmlApplicationContext(
            "applicationcontext.xml");
    UserAction ua = (UserAction) factory.getBean("userAction");
    System.out.println(ua);
    System.out.println(ua.execute());
    
    ua = (UserAction) factory.getBean("userAction");
    System.out.println(ua);
    System.out.println(ua.execute());
    
    ua = (UserAction) factory.getBean("userAction");
    System.out.println(ua);
    System.out.println(ua.execute());
}
id_name_ref(bean、local、parent)などの属性の使い方


    
        
        
    
MainClass.java
    /**
     * BeanFactory factory = new
     * ClassPathXmlApplicationContext("applicationContext02.xml");
     * 
     *  factory     (    )
     * BeanFactory fay = new XmlBeanFactory( newClassPathResource(
     * "applicationContext.xml"), factory );
     */
セットメソッドに集合属性を注入する
UserAction.java
public class UserAction {

    public List list = null;
    public Set set = null;
    public Map map = null;
    public Properties props = null;

    public void setList(List list) {
        this.list = list;
    }

    public void setSet(Set set) {
        this.set = set;
    }

    public void setMap(Map map) {
        this.map = map;
    }

    public void setProps(Properties props) {
        this.props = props;
    }
}
appication Contect.xml


     
    

        
            
                zhaoliou
                
            
        

        
            
                dfdsf
                155.54
                1115
                true
            
        

        
            
                
                    user1
                
                
                    user2
                
            
        

        
            
                jdbc.mysql.Driver
                root
                654321
                jdbc:mysql://localhost:3306/mydb
            
        
    

    
  • MainClass.java
  • public static void main(String[] args) {
    
        BeanFactory factory = new ClassPathXmlApplicationContext(
                "applicationContext.xml");
        UserAction userAction = (UserAction) factory.getBean("userAction");
    
        System.out.println("---------------list------------");
    
        for (Object o : userAction.list) {
            System.out.println(o);
        }
    
        System.out.println("---------------set------------");
    
        for (Object o : userAction.set) {
            System.out.println(o);
        }
    
        System.out.println("----------------map-----------");
    
        for (Iterator iter = userAction.map.entrySet().iterator(); iter
                .hasNext();) {
            System.out.println(iter.next());
        }
    
        for (Object key : userAction.map.keySet()) {
            System.out.println(key + ":" + userAction.map.get(key));
        }
    
        System.out.println("--------------props-------------");
    
        Properties prop = userAction.props;
    
        System.out.println(prop.get("driverClass"));
        System.out.println(prop.get("username"));
        System.out.println(prop.get("password"));
        System.out.println(prop.get("url"));
    }
    構造注入及び注意事項
  • A.java
  • public class A {
        private int id;
        private String username;
        private String password;
        private char sex;
        private Date birthday;
    
        @Override
        public String toString() {
            return "A [id=" + id + ", username=" + username + ", password="
                    + password + ", sex=" + sex + ", birthday=" + birthday + "]";
        }
    
        public A(int id, String username, String password, char sex, Date birthday) {
            super();
            this.id = id;
            this.username = username;
            this.password = password;
            this.sex = sex;
            this.birthday = birthday;
        }
        //  set、get  
        ……
    }
  • appication Contect.xml
  • 
    
    
        
            
            
            
            
            
            
        
        
    
  • MainClass.java
  • public static void main(String[] args) {
        BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");
    
        A a = (A) factory.getBean("a");
        System.out.println(a.toString());
    }
  • 注意事項
  • a)A.java
    public class A {
    
        private B b;
    
        public void setB(B b) {
            this.b = b;
        }
    
        /**
         *      
         */
        public A(B b) {
            super();
            this.b = b;
        }
    
        /**
         *      
         */
        public A() {
            super();
        }
    }
    b)B.java
    public class B {
    
        private A a;
    
        public void setA(A a) {
            this.a = a;
        }
    
        public B(A a) {
            super();
            this.a = a;
        }
    
        public B() {
            super();
        }
    }
    c)appication Contect.xml
    
    
    
        
            
            
        
    
        
            
            
        
    
    自動注入及び注意事項
  • UserManager.java
  • public class UserManager {
    
    public void addUser() {
    
        System.out.println("    !");
    }
    }
  • UserAction.java
  • public class UserAction {
    
        private UserManager manager = null;
    
        /**
         *        
         */
        public UserAction(UserManager manager) {
            super();
            this.manager = manager;
        }
    
        /**
         * set    
         */
        public void setManager(UserManager manager) {
            System.out.println("  manager set    !");
            this.manager = manager;
        }
    
        public String execute() {
            System.out.println(manager);
            manager.addUser();
            return "success";
        }
    }
  • appication Contect.xml
  • 
    
        
        
    
        
    
        
    
  • MainClass.java
  • public static void main(String[] args) {
    
        BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");
    
        UserAction ua = (UserAction) factory.getBean("userAction");
        System.out.println(ua);
        System.out.println(ua.execute());
    }
    注解による注入
  • appication Contect.xml
  • 
    
      
        
        
    
        
    
        
    
  • UserAction.java
  • public class UserAction {
    
        @Resource
        private UserManager manager = null;
        //Set     
        //  @Resource
        //  public void setManager(UserManager manager) {
        //      System.out.println("  manager set    !");
        //      this.manager = manager;
        //  }
    
        public String execute() {
            System.out.println(manager);
            this.manager.addUser();
            return "success";
        }
    }
    Spring自動スキャンコンポーネント
  • appication Contect.xml
  • 
    
        
        
    
        
        
    
  • UserManager.java
  • @Repository("uManager")
    public class UserManager {
    
        public void addUser() {
    
            System.out.println("        User     !");
    
        }
    }
  • UserService.java
  • @Service("uService")
    public class UserService {
    
        @Resource(name = "uManager")
        private UserManager manager;
    
        public void service() {
            System.out.println("  Service");
            manager.addUser();
        }
    }
  • UserAction.java
  • @Controller("uAction")
    //@Scope("prototype") //  
    public class UserAction {
    
        @Resource(name = "uService")
        private UserService service;
    
        public String execute() {
            System.out.println("  Action");
            service.service();
            return "success";
        }
    }
  • MainClass.java
  • public static void main(String[] args) {
    
        BeanFactory factory = new ClassPathXmlApplicationContext(
                "applicationContext.xml");
    
        // UserAction ua = (UserAction) factory.getBean("userAction");
    
        UserAction ua = (UserAction) factory.getBean("uAction");
        System.out.println(ua);
    
        ua = (UserAction) factory.getBean("uAction");
        System.out.println(ua);
    
        ua = (UserAction) factory.getBean("uAction");
        System.out.println(ua);
    
        System.out.println(ua.execute());
    }
    懸念点分離と静的エージェント
  • 懸念点分離
  • Me.java
    @Component
    public class Me {
    
        @Resource
        private Servant servant;
    
        public void dowork() {
    
            makeBeds();//    
            dress();//    
            haveAMeal();//    
    
            System.out.println("   ……");//      
    
            haveAMeal();//    
            makeBeds();//    
            undress();//    
    
        }
    
        //         
        private void makeBeds() {
        System.out.println("   ");
        }
    
        private void dress() {
        System.out.println("   ");
        }
    
        private void haveAMeal() {
        System.out.println("  ");
        }
    
        private void undress() {
        System.out.println("   ");
        }
    }
  • 静的代理
  • a)MeInterface.java
    public interface MeInterface {
    
        public abstract void dowork();
    }
    b)Me.java
    @Component("me")
    public class Me implements MeInterface {
        @Override
        public void dowork() {
    
            System.out.println("   ……");//      
        }
    }
    c)Servant.java
    @Component("ser")
    public class Servant {
        public void work1() {
            this.makeBeds();
            this.dress();
            this.haveAMeal();
        }
    
        public void work2() {
            this.haveAMeal();
            this.puChuang();
            this.undress();
        }
    
        public void makeBeds() {
            System.out.println("   ");
        }
    
        public void dress() {
            System.out.println("   ");
        }
    
        public void haveAMeal() {
            System.out.println("  ");
        }
    
        public void undress() {
            System.out.println("   ");
        }
    
        public void puChuang() {
            System.out.println("  ");
        }
    }
    d)MyProxy.java
    @Component
    public class MyProxy implements MeInterface {
    
        @Resource(name = "me")
        private Me target;//        ,           
    
        @Resource(name="ser")
        private Servant servant;
    
        @Override
        public void dowork() {
    
            servant.work1();
    
            target.dowork();
    
            servant.work2();
        }
    }
    e)代理店の使用
    @Test
    public void test() {
    
        BeanFactory factory = new ClassPathXmlApplicationContext(
                "applicationContext.xml");
        
        MeInterface me = (MeInterface) factory.getBean(MyProxy.class);
        //                ……
        me.dowork();
    }
    動的エージェントとクロスカット懸念点分離
  • DynamicProxyFactory.java
  • public class DynamicProxyFactory implements InvocationHandler {
    
        private DynamicProxyFactory() {
        }
    
        //   new     ,       newInstance    
        private Servant servant;
        private Object target;
    
        /**
         *          
         */
        public static Object newInstance(Object target, Servant servant) {
            DynamicProxyFactory dp = new DynamicProxyFactory();
            dp.servant = servant;
            dp.target = target;
            return Proxy.newProxyInstance(target.getClass().getClassLoader(),
                    target.getClass().getInterfaces(), dp);
        }
    
        @Override
        public Object invoke(Object proxy, Method method, Object[] args)
                throws Throwable {
    
            servant.work1();
    
            Object o = //                   (          )
            method.invoke(target, args);
    
            servant.work2();
            return o;
        }
    }
  • appication Contect.xml
  • 
    
       
        
        
    
        
        
    
        
             
             
        
            
             
             
        
    
  • ダイナミックエージェント
  • @Test
    public void test() {
        BeanFactory factory = new ClassPathXmlApplicationContext(
                "applicationContext.xml");
        
        MeInterface me = (MeInterface) factory.getBean("my");
        //                ……
        me.dowork();
        
        System.out.println("--------------------");
        HeInterface he = (HeInterface) factory.getBean("h");
        he.hedowork();
    }
    SpringのAsppectJを利用して動的代理分離の注目点を作成します.
  • 使うカバン
  •     aspectjrt.jar   Spring    
        aspectjweaver.jar   Spring    
        aopalliance.jar aop
        spring-aop-3.2.0.M1.jar aop   
  • appication Contect.xml
  • 
    
    
        
        
    
        
        
    
        
        
    
  • AspClass.java
  • /**
    *    
    */
    @Aspect
    @Component
    public class AspClass {
    
        @Resource(name = "ser")
        private Servant servant;
    
        @Before("execution(* com.ashmit.spring.MeInterface.*(..))||execution(* com.ashmit.spring.HeInterface.*(..))")
        void before() {
            servant.work1();
        }
    
        @After("execution(* com.ashmit.spring.MeInterface.*(..))||execution(* com.ashmit.spring.HeInterface.*(..))")
        void after() {
            servant.work2();
        }
    }
  • SpringのAsppectJを用いて作成された動的エージェント
  • @Test
    public void test() {
        BeanFactory factory = new ClassPathXmlApplicationContext(
                "applicationContext.xml");
        
        MeInterface me = (MeInterface) factory.getBean("me");
        //                ……
        me.dowork();
        
        System.out.println("--------------------");
        HeInterface he = (HeInterface) factory.getBean("he");
        he.hedowork();
    }
  • 切麺類AspClassを使わなくてもいい
  • a)サーヴァント01
    @Aspect
    @Component
    public class Servant01 implements Ordered {
    
        @Before("execution(* com.ashmit.spring.MeInterface.*(..))||execution(* com.ashmit.spring.HeInterface.*(..))")
        public void makeBeds() {
            System.out.println("   ");
        }
    
        @Override
        public int getOrder() {
            return 0;
        }
    }
    b)Servant 02
    @Aspect
    @Component
    public class Servant02 implements Ordered{
    
        @Before("execution(* com.ashmit.spring.MeInterface.*(..))||execution(* com.ashmit.spring.HeInterface.*(..))")
        public void dress() {
            System.out.println("   ");
        }
    
        @Override
        public int getOrder() {
            // TODO Auto-generated method stub
            return 1;
        }
    }
    c)サーヴァント03
    @Aspect
    @Component
    public class Servant03 implements Ordered {
    
        @Before("execution(* com.ashmit.spring.MeInterface.*(..))||execution(* com.ashmit.spring.HeInterface.*(..))")
        public void haveAMeal() {
            System.out.println("  ");
        }
    
        @After("execution(* com.ashmit.spring.MeInterface.*(..))||execution(* com.ashmit.spring.HeInterface.*(..))")
        public void haveAMeal2() {
            System.out.println("  ");
        }
    
        @Override
        public int getOrder() {
            // TODO Auto-generated method stub
            return 2;
        }
    }
    d)サーヴァント04
    @Aspect
    @Component
    public class Servant04 implements Ordered{
    
        @After("execution(* com.ashmit.spring.MeInterface.*(..))||execution(* com.ashmit.spring.HeInterface.*(..))")
        public void puChuang() {
            System.out.println("  ");
        }
    
        @Override
        public int getOrder() {
            // TODO Auto-generated method stub
            return 1;
        }
    }
    e)Servant 05
    @Aspect
    @Component
    public class Servant05 implements Ordered{
    
        @After("execution(* com.ashmit.spring.MeInterface.*(..))||execution(* com.ashmit.spring.HeInterface.*(..))")
        public void undress() {
            System.out.println("   ");
        }
    
        @Override
        public int getOrder() {
            // TODO Auto-generated method stub
            return 0;
        }
    }
  • Arond、AfterThrowingなど他のAdvice a)Me.java
    @Component("me")
    public class Me implements MeInterface {
    
    @Override
    public void dowork() {
        if (true)
            throw new RuntimeException("RuntimeException……");
        System.out.println("   ……");//      
    }
    }
  • b)AspClass.java
    /**
    *    
    */
    @Aspect
    @Component
    public class AspClass {
    
        @Resource(name = "ser")
        private Servant servant;
    
        /**
         * @param        
         * @return         
         */
            //  @Around("execution(* com.ashmit.spring.MeInterface.*(..))||execution(* com.ashmit.spring.HeInterface.*(..))")
            //  public Object test(ProceedingJoinPoint proceeding) {
            //      Object o = null;
            //      try {
            //          servant.work1();
            //          // proceeding.proceed(proceeding.getArgs());
            //          o = proceeding.proceed();
            //          
            //          servant.work2();
            //      } catch (Throwable e) {
            //          // TODO Auto-generated catch block
            //          e.printStackTrace();
            //      }
            //      return o;
            //  }
    
    
        @Before("execution(* com.ashmit.spring.MeInterface.*(..))||execution(* com.ashmit.spring.HeInterface.*(..))")
        void before() {
            System.out.println("    ……");
            servant.work1();
        }
        @After("execution(* com.ashmit.spring.MeInterface.*(..))||execution(* com.ashmit.spring.HeInterface.*(..))")
        void after() {
            servant.work2();
            System.out.println("    ……");
        }
        /**
         *      (    )
         */
        @AfterReturning("execution(* com.ashmit.spring.MeInterface.*(..))||execution(* com.ashmit.spring.HeInterface.*(..))")
        void test2() {
            System.out.println("  ……");
        }
    
        /**
         *       :      @Around      ,     
         */
        @AfterThrowing("execution(* com.ashmit.spring.MeInterface.*(..))||execution(* com.ashmit.spring.HeInterface.*(..))")
        void test3() {
            System.out.println("   ……");
        }
    }
    Springプロファイルにカットを配置する
  • AspClass.java
  • /**
    *    
    */
    @Component("aspclass")
    public class AspClass {
    
        @Resource(name = "ser")
        private Servant servant;
    
        void before() {
            servant.work1();
        }
    
        void after() {
            servant.work2();
        }
    }
  • appication Contect.xml
  • 
    
    
        
        
    
        
        
    
        
    
        
            
            
    
            
            
                
            
            
                
            
    
        
    
    Spring AOP宣言式事務
  • 使うカバン
  •     commons-dbcp.jar    
        commons-pool.jar    
        spring-jdbc-3.2.0.M1.jar      dataSource  
        spring-orm-3.2.0.M1.jar sessionFactory  
        spring-aop-3.2.0.M1.jar aop   
        spring-tx-3.2.0.M1.jar      
  • appication Contect.xml
  • 
    
    
        
        
    
        
        
    
        
        
            
            
            
            
        
    
        
        
            
            
                
                    com.ashmit.entity.User
                    com.ashmit.entity.Group
                
            
            
                
                    hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
                    hibernate.show_sql=true
                    hbm2ddl.auto=update
                    javax.persistence.validation.mode=none
                    hibernate.cache.use_second_level_cache=true
                    hibernate.cache.use_query_cache=true
        hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.EhCacheRegionFactory
                
            
        
    
        
        
            
        
    
        
        
            
            
                
                
                
                
            
        
    
        
        
            
            
        
    
  • 事務伝播特性
  • 
    
        
        
            
            
            
            
            
            
            
        
    
    SpringとStrutsフレームの集積
  • 使うカバン
  • struts2-spring-plugin-2.3.4.jar  Struts   
    spring-web-3.2.0.M1.jar  Spring   
  • UserAction.java
  • @Controller("userAction")
    public class UserAction implements ModelDriven {
    
        private User user = null;
    
        @Resource(name = "groupService")
        private GroupService groupService = null;
    
        @Resource(name = "userService")
        private UserService userService = null;
    
        //    
        ……
    }
  • web.xml
  • 
    
    
        
        
            org.springframework.web.context.ContextLoaderListener
        
    
        
        
            contextConfigLocation
            /WEB-INF/applicationContext-*.xml,classpath*:applicationContext-*.xml
        
    
        ……
    
    BaseDaoモード
  • BaseDao.java
  • public class BaseDao {
    
        @Resource(name = "sessionFactory")
        private SessionFactory sessionFactory = null;
    
        protected Session getSession() {
            return this.sessionFactory.getCurrentSession();
        }
    }
    OpenSession InViewモード
    怠惰なロードポリシーに対応する
    
    
    
        
        
            org.springframework.web.context.ContextLoaderListener
        
    
        
        
            contextConfigLocation
            /WEB-INF/applicationContext-*.xml,classpath*:applicationContext-*.xml
        
    
        
        
            OpenSessionInViewFilter
            org.springframework.orm.hibernate4.support.OpenSessionInViewFilter
        
        
            OpenSessionInViewFilter
            /*
        
    
        ……