zoukankan      html  css  js  c++  java
  • spring bean管理

    轻量级,无侵入

    Bean管理
      1 创建applicationContext.xml
      2 配置被管理的Bean
      3 获取Bean

    pom.xml配置

    <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>3.2.12.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>3.2.12.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>3.2.12.RELEASE</version>
        </dependency>

    1 创建applicationContext.xml 

    <!-- 打开jar包,docs,spring-framework-reference,html,index,打开后有一行
    点击 这一行 D. XML Schema-based configuration -->
    
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
    
    </beans>

    2 配置被管理的Bean


    比如我们需要对某个dao进行操作,这个dao中有一些方法

    public class UserDao{
      public UserDao() {}
      public void save() {}
      public void init() {}
      public void destroy() {}
    }

    <!-- 把类交给spring管理,用bean节点 ,class是受管理的完全限定名,
        id,也可以用name(name就可以取多个名字)
        <bean name="userDao,myDao" class="com.kaishengit.dao.UserDao"></bean>
        
        如果用id表示,还想给他赋name属性
        <bean id="userDao" class="com.kaishengit.dao.UserDao"/>
        <alias name="userDao" alias="myDao"/>
        name处放id的值
        -->
    <bean id="userDao" class="com.kaishengit.dao.UserDao"></bean>

    3 获取Bean

    public class Test {
        public static void main(String[] args) {
            //读取applicationContext.xml配置文件
            ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
            /*以前创建对象是new,现在交给spring后,就是用getBean,userDao是配置中id的名字*/
            UserDao dao = (UserDao) context.getBean("userDao");
            dao.save();
        }
    }    

    表现其 无侵入性
    只需要在UserDao中有定义这两个方法init ,destroy,就能在初始化时候执行init,销毁时执行--
    destroy,而且在UserDao中没有导入什么什么包的

    <bean id="userDao" class="com.kaishengit.dao.UserDao" init-method="init" destroy-method="destroy"/>


    ------------------------------------------------------------------------------------------------------------

    ------------------------------------------------------------------------------------------------------------

    交给spring的类,默认都是单例模式

        
    /* 在容器启动的时候
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); 
    就会读取这个文件,并且创建所有交给spring处理的类 */
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    UserDao dao = (UserDao) context.getBean("userDao");    
    /*所以在getBean的时候就不会创建对象,即使是
        UserDao dao = (UserDao) context.getBean("userDao");    
        UserDao dao2 = (UserDao) context.getBean("userDao");    
        也只是执行一次构造方法,可以看出,这是单例模式*/

    那么如何改变这种单例模式? 比如在action的时候,每次请求都要到达一个action--
    这个是不能单例的

    Bean scopes

    1 singleton(默认)
    <bean id="userDao" class="com.kaishengit.dao.UserDao" scope="singleton"></bean>


    2 prototype
    <bean id="userDao" class="com.kaishengit.dao.UserDao" scope="prototype"></bean>

    /* 这时候在执行
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); 
    的时候就不会创建所有交给spring的类,而是在getbean的时候去创建
     ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    UserDao dao = (UserDao) context.getBean("userDao");
    UserDao dao2 = (UserDao) context.getBean("userDao");    
    就真的会执行两次构造方法,创建两个对象*/

    -----------------------------------------------------------------------------------

    -----------------------------------------------------------------------------------

    Bean的延迟加载

    <bean id="userDao" class="com.kaishengit.dao.UserDao" lazy-init="true"></bean>    
    /* 这时候在执行
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); 
    的时候就不会创建所有交给spring的类,而是在第一次使用getbean的时候去创建
     ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    UserDao dao = (UserDao) context.getBean("userDao");
    UserDao dao2 = (UserDao) context.getBean("userDao");    
    但是还是只执行一次构造方法*/

    ------------------------------------------------------------------------
    ------------------------------------------------------------------------
    ------------------------------------------------------------------------

    IOC DI
      1. ICO 控制翻转
      2. DI 依赖注入
        注入的两种方式
          1 set注入
          2 构造方法注入

    UserService依赖UserDao 以前是:

    public class UserService {
    
        private UserDao userDao = new UserDao();
        public void save() {
            userDao.save();
        }
    }

    那么就不用new,选择set注入

    public class UserService {
        
        private UserDao userDao;
        
        
        public void save(){
            System.out.println("1111");
        }
        //生成set方法
        public void setUserDao(UserDao userDao) {
            this.userDao = userDao;
        }
    }

    需要配置

    <bean id="userDao" class="com.kaishengit.dao.UserDao"/>
    <bean id="userService" class="com.kaishengit.service.UserService">
        <!-- name="userDao"是被注入类的属性名字 ,,是setUserDao的set后面的名字
        ref="userDao"的这个userDao要和上面的id名字一致    -->
        <property name="userDao" ref="userDao"/>
    </bean>
    
    
    <!-- 或者是这种形式 -->
        
    <bean id="userDao" class="com.kaishengit.dao.UserDao"/>
    <bean id="userService" class="com.kaishengit.service.UserService">
        <!-- userDao是被注入类的属性名字 ,,是setUserDao的set后面的名字-->
        <property name="userDao">
        <!-- ref="userDao"的这个userDao要和上面的id名字一致    -->
            <ref bean="userDao"/>
        </property>
    </bean>    
        
        
        <!-- 再或者是这种形式 -->
    <bean id="userDao" class="com.kaishengit.dao.UserDao"/>
    <bean id="userService" class="com.kaishengit.service.UserService">
        <property name="userDao">
            <bean class="com.kaishengit.dao.UserDao"/>
        </property>
    </bean>

    ------------------------------------------------------------------------
    ------------------------------------------------------------------------

    其他set注入

    public class BookService {
    
        private int age;
        private String name;
        private List<String> address;
        private Set<String> depts;
        private Map<String, String> maps;
        // 本身也是一个map结构 
        private Properties prop;
        
        
        public void show() {
            System.out.println("age:" + age);
            System.out.println("name:" + name);
            System.out.println("--------List---------");
            for(String str : address) {
                System.out.println(str);
            }
            System.out.println("--------Set----------");
            for (String str : depts) {
                System.out.println(str);
            }
            System.out.println("--------Map----------");
            for(Entry<String, String> entry : maps.entrySet()) {
                System.out.println(entry.getKey() + " :" + entry.getValue());
            }
            
            System.out.println("--------Properties--------");
            for(Entry<Object, Object> entry : prop.entrySet()) {
                System.out.println(entry.getKey() + " :" + entry.getValue());
            }
            
        }
        
        
        
        public void setAge(int age) {
            this.age = age;
        }
        public void setName(String name) {
            this.name = name;
        }
        public void setAddress(List<String> address) {
            this.address = address;
        }
        public void setDepts(Set<String> depts) {
            this.depts = depts;
        }
        public void setMaps(Map<String, String> maps) {
            this.maps = maps;
        }
        public void setProp(Properties prop) {
            this.prop = prop;
        }

    注入

    <bean id="book" class="com.kaishengit.service.BookService">
        <property name="age" value="23"/>
        <property name="name" value="Alex"/>
        <property name="address">
            <list>
                <value>add1</value>
                <value>add2</value>
                <value>add3</value>
            </list>
        </property>
        <property name="depts">
            <set>
                <value>s1</value>
                <value>s2</value>
                <value>s3</value>
            </set>
        </property>
        
        <property name="maps">
            <map>
                <entry key="k1" value="v1"/>
                <entry key="k2" value="v2"/>
                <entry key="k3" value="v3"/>
            </map>
        </property>
        
        <property name="prop">
            <props>
                <prop key="p1">v1</prop>
                <prop key="p2">v2</prop>
                <prop key="p3">v3</prop>
            </props>
        </property>
        
    </bean>

    main函数中

    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
            
    BookService bookService = (BookService) context.getBean("book");
    bookService.show();

    ------------------------------------------------------------------------------------------------------

    ------------------------------------------------------------------------------------------------------

    构造方法注入 

    public class UserService {
    
        private UserDao userDao;
        
        public UserService(UserDao userDao,String name) {
            this.userDao = userDao;
            System.out.println("name:" + name);
        }
        
        
        public void save() {
            userDao.save();
        }
    
    }    

    需要配置

    <bean id="userDao" class="com.kaishengit.dao.UserDao"/>
        
        <bean id="userService" class="com.kaishengit.service.UserService">
        <!-- name是上面构造方法中参数的userDao,ref指注入的是配置中id的userDao这个类
            不仅支持name,还支持index
            <constructor-arg index="0" ref="userDao"/>这里的index指的是给第几个--
            参数传值-->
            <constructor-arg name="userDao" ref="userDao"/>
            <constructor-arg name="name" value="Jack"/>
        </bean>    

    ========================================================================

    ========================================================================

    ========================================================================

    接下来再说一个自动注入的

    <!-- 自动注入 
    
        autowire="byName"之后就在整个配置文件中找setXxx方法的这个id叫做xxx的
        比如setUserDao,就找id为userDao的,所以id就不能随便改-->
    <bean id="userDao" class="com.kaishengit.dao.UserDao"/>
    <bean id="userService" class="com.kaishengit.service.UserService" autowire="byName"/>
        
        <!-- 去寻找类型匹配的数据com.kaishengit.dao.UserDao 
            但是有多个相同类型的就不行了---->
    <bean id="userDao" class="com.kaishengit.dao.UserDao"/>
    <bean id="userService" class="com.kaishengit.service.UserService" autowire="byType"/>
        
        
        <!-- 构造方法注入,这种方法是先byName,找不到,就byType -->
    <bean id="userDao" class="com.kaishengit.dao.UserDao"/>
    <bean id="userService" class="com.kaishengit.service.UserService" autowire="constructor"/>
  • 相关阅读:
    win7环境下一次浅谈栈溢出
    字符约束条件的SQL注入攻击
    较有意思的Apple XSS(CVE-2016-7762)漏洞
    metasploit下Windows下多种提权方式
    NTFS ADS带来的web安全问题
    某安全团队内部渗透比赛
    MySQL注射绕过技巧(三)
    MySQL注射绕过技巧(二)
    MySQL注射绕过技巧
    centos7 zabbix3.4.6显示中文乱码问题
  • 原文地址:https://www.cnblogs.com/itliucheng/p/4463641.html
Copyright © 2011-2022 走看看