spring 03 处理对象的依赖关系

给对象属性赋值(DI, 依赖注入),几种方式:

  1. 构造函数赋值
  2. set 方法注入值
  • 普通字段赋值
  • 集合属性 (list/map/property)
  1. 案例(Dao/service/action实例,处理依赖关系)
  • 常用的通过set方法注入
  • 内部bean
  • p名称空间
  • 自动装配
  • 注解
案例1:

beam.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
    
    <!--IOC容器, 给对象属性赋值 -->
    
    <bean id="user" class="cn.itcast.c_di.User">
        <property name="id" value="1000"></property>
        <property name="name" value="Jacky"></property>
        <!-- list集合赋值 -->
        <property name="list">
            <list>
                <value>cn</value>
                <value>usa</value>
            </list>
        </property>
        <!-- map 集合赋值 -->
        <property name="map">
            <map>
                <entry key="cn" value="China"></entry>
                <entry key="usa" value="1234"></entry>
            </map>
        </property>
        <!-- Properties对象赋值 -->
        <property name="prop">
            <props>
                <prop key="cn">China</prop>
                <prop key="usa">America</prop>
            </props>
        </property>
    </bean>
    
    
</beans>      

@Data
public class User {

    private int id;
    private String name;
    // list集合
    private List<String> list;
    // Map集合
    private Map<String,Object> map;
    // Properties 对象
    private Properties prop;
    
}
案例2:

beam.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">
  
    <!-- 使用setter方法来注入属性依赖(使用最为普遍)
        <bean id="userDao" class="com.xxjqr.spring01.di2.UserDao"></bean> 
        
        <bean id="userService" class="com.xxjqr.spring01.di2.UserService">
            <property name="userDao" ref="userDao"></property>  //name表示的也是属性名哦!
        </bean>
        
        <bean id="userAction" class="com.xxjqr.spring01.di2.UserAction" scope="prototype">
            <property name="userService" ref="userService"></property>
        </bean>
     -->
     
    <!-- 内部bean 
    总结: 当创建的对象,不被容器其他地方引用的时候,可以这样写! 这样写不通用,内部对象只能用一次 
    这里,action如果是单例,内部bean默认就是单例;  action如果是多例,内部bean就是多例
    
    <bean id="userAction" class="com.xxjqr.spring01.di2.UserAction" scope="prototype">
        <property name="userService">
            <bean class="com.xxjqr.spring01.di2.UserService">
                <property name="userDao">
                    <bean class="com.xxjqr.spring01.di2.UserDao"></bean>
                </property>
            </bean>
        </property>
    </bean>
    -->
     
     <!-- p名称空间给属性注入
        <bean id="name" class="java.lang.String">
            <constructor-arg value="丁丁"></constructor-arg>
        </bean>
        
        <bean id="user" class="com.xxjqr.spring01.di2.User" p:name-ref="name" p:sex="男" p:age="22">
        </bean>
      -->
     
     
     <!-- 使用p名称空间来注入属性依赖(使用最为普遍)-->
     <bean id="userDao" class="com.xxjqr.spring01.di2.UserDao"></bean>
     <bean id="userService" class="com.xxjqr.spring01.di2.UserService" p:userDao-ref="userDao"></bean>
     <bean id="userAction" class="com.xxjqr.spring01.di2.UserAction" p:userService-ref="userService"></bean>
     
     <!-- 最后:
     uesrDao和userService默认是单例的,因为他们内部没有维护一些需要变动的变量
     userAction用来处理每次的请求不能设置为单例的
     
     使用p名称空间的前提:
     1.xmlns:p="http://www.springframework.org/schema/p"
     2.spring3.0以后
      -->
      
 </beans>

类:
UserAction->UserService->UserDao
同样的结构,只是beam.xml的不同

自动装配

beam.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd"
        default-autowire="byName">
    
    <!-- 自动装配(全局装配) 
    default-autowire="byName
    -->
    
  
    <!-- 自动装配(节点装配)
    autowire=byName
    (查看该类中的setter方法(如setUserDao),找到了UserDao,
    然后在容器中找该名称对象,再通过setter方法完成注入)
    
    autowire=byType
    (查看该类中的setter方法(如setUserDao(UserDao xx))
    ,找到了UserDao类型,然后在容器中找该类型对象,再通过setter方法完成注入)
     -->
     
     <!-- 最后:
     使用autowire的时候,名称和类型不能有重复的对象 -->
     
    <bean id="userDao" class="com.xxjqr.spring01.auto_wire.UserDao"></bean>
    <bean id="userService" class="com.xxjqr.spring01.auto_wire.UserService"></bean>
    <bean id="userAction" class="com.xxjqr.spring01.auto_wire.UserAction"></bean>
 </beans>
注解方式

导入schema文件 文件名为spring-context-2.5.xsd
beam.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

    <!-- 注解的方式,实现springIOC容器配置 -->
    <!-- 1. 开启注解扫描 -->
    <context:component-scan base-package="com.xxjqr.spring01.anno"></context:component-scan>
    
</beans> 

@Controller //==@Controller("userAction")
@Data
public class UserAction {
    @Resource //==@Resource("")
    private UserService userService;
    
    public void save(){
        userService.save();
    }
}
@Data
@Service
public class UserService {
    @Resource
    private UserDao userDao;
    
    public void save(){
        userDao.save();
    }
}

@Repository
public class UserDao {
    public void save(){
        System.out.println("已经save");
    }
}
public class App {
    private ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml",App.class);

    @Test
    public void testUserAction() {
        //创建容器
        UserAction action = (UserAction) ac.getBean("userAction");
        action.save();
    }

}

注解总结:
@Component 表示一个组件(类),把当前组件加入ioc容器加入容器的组件的名称默认是类名第一个字母小写

@Component(“”) 指定加入ioc容器的组件类的类名
@Repository 标识是一个持久层的组件
@Service 标识是一个业务逻辑层的组件
@Controller 标识是一个控制层的组件
@Scope("prototype") 指定对象单例/多例
@Resource

  1. 默认根据修饰的字段名称会取ioc容器找对象自动注入
    找到后注入
  2. 如果名称没有找到,再根据类型查找 找到后就立刻注入
    如果改类型在ioc容器中有多个对象,报错!
  3. 根据类型也没有找到对象,报错!

@Resource(name =””) 会根据指定的名称去容器找对象自动注入

配置方式与注解方式:

  1. 配置, 便于维护但配置过多,比较繁琐
  2. 注解, 开发方便但简化配置,不利于后期维护,如果修改对象创建、关系处理,需要改代码!
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容