• Ioc和Aop扩展--多种方式实现依赖注入(构造注入,p命名空间注入,集合类型注入,注入null和注入空值)


    构造注入

    语法:

    <constructor-arg>

       <ref bean=“bean的id”/>

    </constructor-arg>

    1.首先创建一个实体类,一定要有带参构造

    public class UserEntity {
        private Integer id;
        private String name;
        private String pwd;
        private CardEntity myCard;
    
        public UserEntity() {
            System.out.println("UserEntity初始化============================");
        }
    
        public UserEntity(Integer id, String name, String pwd, CardEntity myCard) {
            super();
            this.id = id;
            this.name = name;
            this.pwd = pwd;
            this.myCard = myCard;
        }
        // 省略get,set
    }

    2.创建dao

    public interface UserEntityDao {
        public void save(UserEntity user);
    }

    2.创建dao实现类

    public class UserEntityDaoImpl implements UserEntityDao {
    
        @Override
        public void save(UserEntity user) {
        }
    
    }

    3.创建biz

    public interface UserEntityBiz {
        public void save(UserEntity user);
    
    }

    4.创建biz实现类,植入一个dao对象

    public class UserEntityBizImpl implements UserEntityBiz {
        private UserEntityDao userDao;
    
        public UserEntityBizImpl() {
        }
    
        public void UserEntityBizImpl(UserEntityDao userDao) {
            this.userDao = userDao;
        }
        
        @Override
        public void save(UserEntity user) {
            userDao.save(user);
            System.out.println("===保存成功====");
        }
        //省略get,set
    }

    5.配置xml

    <bean id="card" class="cn.cnsdhzzl.entity.CardEntity">
            <property name="id" value="123"></property>
            <property name="cardNumber" value="1111111110000"></property>
        </bean>
    
        <bean id="userDao" class="cn.cnsdhzzl.dao.impl.UserEntityDaoImpl" />
    
        <bean id="userBiz" class="cn.cnsdhzzl.biz.impl.UserEntityBizImpl">
            <constructor-arg>
                <ref bean="userDao"></ref>
            </constructor-arg>
        </bean>
    
        <bean id="userEntity" class="cn.cnsdhzzl.entity.UserEntity">
            <constructor-arg index="0" type="java.lang.Integer"
                value="001" />
            <constructor-arg index="1" type="java.lang.String"
                value="002用户" />
            <constructor-arg index="2" type="java.lang.String"
                value="003用户密码" />
            <constructor-arg index="3" ref="card" />
        </bean>

    6.测试

    @Test
        /*
         * 构造注入
         */
        public void constructorSpring() {
            ApplicationContext ac = new ClassPathXmlApplicationContext(
                    "applicationContext.xml");
            UserEntityBizImpl biz = (UserEntityBizImpl) ac.getBean("userBiz");
            UserEntity ue = (UserEntity) ac.getBean("userEntity");
            biz.save(ue);
            System.out.println(ue.toString());
    }

    p命名空间注入

    语法:

    p:属性名=“属性值”

    p:属性名-ref=“bean的id”

    1.准备一个实体类

    public class CardEntity {
        private Integer id;
        private String cardNumber;
    
        public CardEntity() {
        }
    
        public CardEntity(Integer id, String cardNumber) {
            this.id = id;
            this.cardNumber = cardNumber;
        }
    
        @Override
        public String toString() {
            return "CardEntity [id=" + id + ", cardNumber=" + cardNumber + "]";
        }
        //省略get,set
    }

    2.配置xml

    <!-- 使用p空间实现属性注入 -->
        <bean id="card" class="cn.cnsdhzzl.entity.CardEntity" p:id="001"
            p:cardNumber="62256549361" />

    3.测试

    @Test
        /*
         * P命名空间注入
         */
        public void PInjection() {
            CardEntity card = (CardEntity) ac.getBean("card");
            System.out.println(card.toString());
        }

    注:如果属性中包括了xml中的特殊字符(&、<、>、"、'),则注入时需要进行处理,通常可以采用两种方法:使用<![CDATA[]]>标记或把字符串替换为实体引用。

    xml中预定义的实体引用
    符号 实体引用 符号 实体引用
    < &lt; ' &apos;
    > &gt; " &quot;
    & &amp;    

    注入集合类型的属性

    1.list

    <bean id="user" class="cn.cnsdhzzl.entity.UserEntity">
            <property name="hobbies">
                <list>
                    <value>计算机</value>
                    <value>运动</value>
                </list>
            </property>
        </bean>

    2.set

    <bean id="user" class="cn.cnsdhzzl.entity.UserEntity">
            <property name="hobbies">
                <set>
                    <value>计算机</value>
                    <value>运动</value>
                </set>
            </property>
        </bean>

    3.map

    <bean id="user" class="cn.cnsdhzzl.entity.UserEntity">
            <property name="hobbies">
                <map>
                    <entry>
                        <value>计算机</value>
                    </entry>
                    <entry>
                        <value>运动</value>
                    </entry>
                </map>
            </property>
        </bean>

    4.props

    <bean id="user" class="cn.cnsdhzzl.entity.UserEntity">
            <property name="hobbies">
                <props>
                    <prop key="computer">计算机</prop>
                    <prop key="motion">运动</prop>
                </props>
            </property>
        </bean>

    5.注入null和空值

    <!-- 注入空字符串 -->
        <bean id="user" class="cn.cnsdhzzl.entity.UserEntity">
            <property name="hobbies">
                <value></value>
            </property>
        </bean>
    <!-- 注入null -->
        <bean id="user" class="cn.cnsdhzzl.entity.UserEntity">
            <property name="hobbies">
                <null></null>
            </property>
        </bean>
  • 相关阅读:
    Lodash JS实用类库 数组操作 延时执行 功能强大
    7.【nuxt起步】-Nuxt与后端数据交互
    vue图片懒加载
    猎鹰与龙飞船基于 Linux,采用 C++、Chromium 与 JS 开发
    | 和 ||,& 和 && 的区别
    Linux安装.net core
    Linux下程序后台运行:nohup和&
    vuejs如何调试代码
    全局安装 Vue cli3 和 继续使用 Vue-cli2.x
    导入sass文件
  • 原文地址:https://www.cnblogs.com/cnsdhzzl/p/5945083.html
Copyright © 2020-2023  润新知