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容器 然后从容器中获取对应的组件