开发步骤
1.创建工程:
1)maven工程
2)添加web.xml
3) 导入依赖的jar包
4)配置文件
2.定义类
在cn.tedu.demo包中定义King
public class King{
}
3.在配置文件中配置bean对象
<!--
1.实例化对象,默认对象为单例模式
2.scope属性表示设置bean的作用域
prototype表示多例模式
默认值singleton表示单例模式
-->
<bean id="king" class="cn.tedu.demo.King"
scope="singleton"/>
##4.延迟加载
1.立即加载:默认情况下,当初始化容器对象时,所有的bean对象就会被实例化,这种的加载对象的方式,叫立即加载 。
为什么延迟加载:节省内存
2.实现延迟加载:
<bean id="king1" class="xx.xx.King"
lazy-init="true"/>
##IOC(重点)
IOC:控制反转(Inversion Of Control),原来创建和管理(维护)对象由程序代码完成,现在把创建和管理(维护)对象的权利交给Spring容器管理,我们把控制权的转移叫控制反转。
(创建对象)
注意:bean的生命周期和延迟加载在bean的单例模式下有效
给成员变量赋值(依赖注入DI)**
依赖注入在Spring中提供两种方法:set方法依赖注入和
构造方法依赖注入
##1.set方法依赖注入(推荐使用)
页面-控制器-业务层-持久层
1.定义持久层的接口和实现类
在cn.tedu.dao包中定义接口UserDao,定义5个方法。在实现类UserDaoImpl中实现5个方法。
public interface UserDao{
void insertUser();
void updateUser();
void deleteUserById();
void selectById();
void selectAllUser();
}
public UserDaoImpl implements UserDao{
public void insertUser(){
System.out.println("添加成功");
}
。。。。
}
在cn.tedu.service包,定义接口(UserService),在接口中定义方法;定义接口的实现类,实现接口中的方法
public interface UserSerivce{
void addUser();
}
public class UserServiceImpl implements UserService{
private UserDao userDao;
public void setUserDao(UserDao userDao){
this.userDao = userDao;
}
public void addUser(){
//调用dao层的方法insertUser()方法
//userDao.insertUser();
}
}
在配置文件中配置信息
<!--
1.实例化业务层的对象
2.property表示给成员变量赋值(属性赋值)
3.name表示属性名
4.ref表示已经创建好的对象的id名
-->
<bean id="userDao" class="cn.tedu.dao.UserDaoImpl"/>
<bean id="userService"
class="cn.tedu.service.UserServiceImpl">
<!-- 相当于调用set方法 -->
<property name="userDao" ref="userDao"/>
</bean>
测试:
@Test
public void test3(){
AbstractApplicationContext ac =
new ClassPathXmlApplicationContext(
"application.xml");
UserService us =
ac.getBean("userService",
UserService.class);
us.addUser();
ac.close();
}
##2.构造方法依赖注入
在UserServiceImpl类中添加带参数的构造方法
public UserServiceImpl(){}
public UserServiceImpl(UserDao userDao){
this.userDao = userDao;
}
<bean id="userDao" class="cn.tedu.dao.UserDaoImpl"/>
<!--
1.constructor-arg表示使用构造方法给成员变量赋值
2.index表示构造方法参数的索引(从0开始)
3.ref表示已经创建好的对象id
-->
<bean id="userService2"
class="cn.tedu.service.UserServiceImpl">
<constructor-arg index="0" ref="userDao"/>
</bean>
##3.自动装配(了解)
byName,byType
<!--
1.autowire表示自动装配
2.byName表示匹配属性名,完成依赖注入
(UserServiceImpl中有个属性userDao,byName方式赋值
就是去找id="userDao"名字的实例化对象赋值)
-->
<bean id="userService3"
class="cn.tedu.service.UserServiceImpl"
autowire="byName"/>
<!--
1.byType表示按属性的类型匹配,实现依赖注入
2.如果有两个对象同属于一个类型,那么使用byType会出现异常
-->
<bean id="userService4"
class="cn.tedu.service.UserServiceImpl"
autowire="byType"/>
##DI:依赖注入(Dependency Injection)
通常情况下,一个类不能完成复杂的业务处理,会有多个类一起合作完成,就会出现一个类中会调用另外一个类的方法,就需要给依赖的对象赋值,所有在程序运行过程中动态给组件(成员变量)赋值,这种方式就叫依赖注入。
#给属性,各种集合赋值
<bean id="valueBean"
class="cn.tedu.demo.ValueBean">
<!--
给基本数据类型和字符串赋值使用value属性
-->
<property name="name" value="王影"/>
<property name="age" value="18"/>
<property name="like">
<list>
<value>旅游</value>
<value>看电视剧</value>
<value>听音乐</value>
</list>
</property>
<property name="city">
<set>
<value>沈阳</value>
<value>大连</value>
<value>鞍山</value>
<value>抚顺</value>
</set>
</property>
<property name="map">
<map>
<entry key="name" value="张志豪"/>
<entry key="age" value="18"/>
</map>
</property>
<property name="prop">
<props>
<prop key="driverClassName">com.mysql.jdbc.Driver</prop>
<prop key="url">jdbc:mysql://localhost:3306/db</prop>
<prop key="username">root</prop>
<prop key="password">root</prop>
</props>
</property>
给集合赋值还可以使用引用对象的方式实现依赖注入
<bean id="valueBean2"
class="cn.tedu.demo.ValueBean">
<property name="like" ref="listLike"/>
</bean>
<util:list id="listLike">
<value>1111</value>
<value>2222</value>
</util:list>