Spring 基础入门-day02

day01的练习

需要使用枚举类型,限制suit的 赋值只能为四种花色。

//Suit.java 枚举类型
public enum Suit {
	黑桃,红桃,梅花,方片
}

在Card.java封装类的无参构造方法中设置参数时只能使用Suit.花色的方式赋值或null,其它非枚举内的值都不能赋值。

配置文件和测试文件参照day01的写法完成。

1.什么是DI???

     Dependence   Injection   依赖注入

     解决的是组件之间的装配问题,把合适值推到合适的位置

2.实现依赖注入的方式

        2.1setter注入--->相当于给对象赋值

                      参考是这个对象对应的类型中的set方法。 成员变量+get方法+set方法=属性

                 准则是把set去掉 然后首字母小写。

                 注意:简单值(String 枚举 八种基本类型 基本类型封装类) 可以使用value直接赋值。

<bean id="card" class="com.xdl.bean.Card">
	<property name="point" value="A"></property>
        <property name="suit" value="梅花"></property>
</bean>

               或者在无参构造方法中调用枚举,传参。(优先级没有在配置文件的属性标签赋值的有优先级高)         

public Card() {
		super();
		this.suit = Suit.梅花;
}

                测试类运行结果:Card [suit=梅花, point=A]

               复杂值 需要使用ref="容器中组件的id" 来进行赋值

<bean id="card" class="com.xdl.bean.Card">
		<property name="point" value="A"></property>
		<property name="suit" value="黑桃"></property>
</bean>
<bean id="player" class="com.xdl.bean.Player">
		<property name="id" value="1"></property>
		<property name="name" value="发哥"></property>
		<property name="age" value="55"></property>
		<property name="money" value="1"></property>
		<property name="card" ref="card"></property>
</bean>

          2.2 构造器注入

          参考类型中对应的构造方法

         配置文件中 只要把property改成constructor-arg即可,可以写name="变量名" 或 index="下标(从0开始)"与有参构造顺序一一对应的方式给值。

其它规则与上面相同。给card赋值。

	<bean id="card2" class="com.xdl.bean.Card">
		<constructor-arg index="0" value="方片"></constructor-arg>
		<constructor-arg index="1" value="K"></constructor-arg>
	</bean>

                                 给player赋值。复杂值 需要使用ref="容器中组件的id" 来进行赋值。

<bean id="player2" class="com.xdl.bean.Player">
		<constructor-arg name="id" value="2"></constructor-arg>
		<constructor-arg name="name" value="陈小刀"></constructor-arg>
		<constructor-arg name="age" value="35"></constructor-arg>
		<constructor-arg name="money" value="153"></constructor-arg>
		<constructor-arg name="card" ref="card2"></constructor-arg>
</bean>

          2.3自动化注入(一般只支持复杂值)

         在bean 标签中 加一个属性 autowire="对应的取值"

         对应的取值 有 no 这是默认的 代表不自动化注入

         byName 按照名字进行自动注入 参考的是set方法

         byType   按照成员变量对应的类型  如果类型匹配则自动化注入

         constructor     这是参考构造方法进行自动化注入 直接对参数进行

                                类型的匹配当有两个相同类型的时候程序崩溃

例子:使用byName 前提是Player.java中有一个setCard方法。

<bean id="card" class="com.xdl.bean.Card">
		<constructor-arg index="0" value="方片"></constructor-arg>
		<constructor-arg index="1" value="K"></constructor-arg>
</bean>
<bean id="player2" class="com.xdl.bean.Player" autowire="byName">  <!-- 或者使用byType-->
		<property name="id" value="1"></property>
		<property name="name" value="发哥"></property>
		<property name="age" value="55"></property>
		<property name="money" value="1"></property>
</bean>

例子:使用constructor 

<bean id="card" class="com.xdl.bean.Card">
		<constructor-arg index="0" value="方片"></constructor-arg>
		<constructor-arg index="1" value="K"></constructor-arg>
</bean>
<bean id="player3" class="com.xdl.bean.Player" autowire="constructor">
		<constructor-arg name="id" value="2"></constructor-arg>
		<constructor-arg name="name" value="陈小刀"></constructor-arg>
		<constructor-arg name="age" value="35"></constructor-arg>
		<constructor-arg name="money" value="153"></constructor-arg>
</bean>

3.参数注入

          3.1 简单值和复杂值的注入

                做一个案例  构建一个数据源对象也叫连接池对象。就是使用db.properties文件中的数据连接到Oracle数据库。

<!-- 配置文件中配置-->	
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
		<property name="driverClassName" value="oracle.jdbc.OracleDriver"></property>
		<property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:MLDN"></property>
		<property name="username" value="system"></property>
		<property name="password" value="123456"></property>
</bean>
//测试类
public static void main(String[] args) throws Exception {
		ApplicationContext app = 
				new ClassPathXmlApplicationContext("applicationContext.xml");
		DataSource dataSource = app.getBean("dataSource",DataSource.class);
		System.out.println(dataSource.getConnection());
}

       3.2 集合参数的注入

           如果java类中的成员变量 或者 set方法的参数是一个集合类型 

           那Spring配置文件 有对应的标记可以给集合类型参数注入值

           list列表中数据可以重复,set列表中数据不能重复(自动去重)根据自己的需求选择合适的列表

           但是要注意的是list列表对应封装类中的私有成员变量也为list。set类型的对应的成员变量也为set类型的

<bean id="msgBean" class="com.xdl.bean.MsgBean">
		<property name="title" value="王者荣耀"></property>
		<property name="length" value="190"></property>
		<property name="friends">
			<list>
				<value>李伟杰</value>
				<value>朱亚孟</value>
				<value>桓晓曼</value>
				<value>朱亚孟</value>
			</list>
		</property>
		<property name="friends2">
			<set>
				<value>李伟杰</value>
				<value>朱亚孟</value>
				<value>桓晓曼</value>
				<value>朱亚孟</value>
			</set>
		</property>
	</bean>

 

//测试类
public static void main(String[] args) {
		ApplicationContext app = 
				new ClassPathXmlApplicationContext("applicationContext.xml");
		MsgBean  msgBean = app.getBean("msgBean",MsgBean.class);
		System.out.println(msgBean+":"+msgBean.getFriends2());
}
//测试结果
MsgBean [title=王者荣耀, length=190, friends=[小乔, 大乔, 王昭君, 大乔]]:[小乔, 大乔, 王昭]

         

<!-- 配置map 和property的死格式-->
</property>
			<property name="phones">
			<map>
				<entry key="1303798456" value="小李"></entry>
				<entry key="1303789789" value="小里"></entry>
				<entry key="1303798458" value="小离"></entry>
			</map>
		</property>
<property name="phones2">
			<props>
				<prop key="1565465465">小朱</prop>
				<prop key="1565465464">小曼</prop>
			</props>
</property>

 

//测试用例
public static void main(String[] args) {
		ApplicationContext app = 
				new ClassPathXmlApplicationContext("applicationContext.xml");
		MsgBean  msgBean = app.getBean("msgBean",MsgBean.class);
		System.out.println(msgBean+":"+msgBean.getFriends2()+":"+msgBean.getPhones()+":"+msgBean.getPhones2());
}

四种配置xml文件的格式

List    -------  <list>
                       <value>值</value>
                   </list>   
   
  Set      ------- <set>
                       <value>值</value>
                   </set>  

  Map     --------- <map>
                       <entry  key=""  value="" /> 
                    </map>   
  Properties  ------<props>
                       <prop  key="">值</prop>  
                    </props>   

       3.3集合的单独定义(集合数据)

<util:list id="">

                <values></values>.....

</util:list>

 Set  还有 Map  和上面类似  只有 Properties特殊
 <util:properties id="" >
           <prop  key=""> 值 </prop>
 </util:properties>     

需要赋值相同的集合数据的时候,可以使用。用法:在标签中加入ref="id"

        3.4其实Properties 单独定义时 可以加载一个. properties配置文件

     <!--  Properties 集合单独定义 并关联一个db.properties 文件  -->
    <util:properties  id="ref_db"  location="classpath:db.properties">//类文件下文件夹下找
    </util:properties>

 

 4 Spring EL 表达式

只要把 EL表达式中的 $  换成 #      就可以把一个对象对用的属性取出来。在容器中取!

<bean id="player" class="com.xdl.bean.Player">
        <properry name="name" value="system"></property>
</bean>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
		<property name="driverClassName" value="oracle.jdbc.OracleDriver"></property>
		<property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:MLDN"></property>
		<property name="username">
               <value>#{player.name}</value>
        </property>
		<property name="password" value="123456"></property>
</bean>

5  组件扫描

         5.1 什么是组件扫描

             Spring框架提供的一套基于标注(注解)的技术,是为了简化XML编写繁琐问题的技术。

        5.2如何实现组件扫描

             a.建立一个项目 导入jar包(ioc aop)拷贝配置文件到src下            

             b.在Spring容器对应的配置文件中 开启文件扫面

                    <context:component-scan   base-package="包名" />

              c.建立一个类 

                     在类上加对应的标注

                @Component 通用层标注

                 @Repository 持久层标注 DAO   dao类的实现Impl类

                 @Service 服务层标注 业务层标注

                 @Controller  控制层标注

             d.构建一个Spring容器 然后从容器中获取对应的组件

 

            

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值