发表于: 2017-09-30 23:44:00
1 769
一 今天完成的事情:
1.Spring框架的基本作用
Spring 能做到什么?通过未使用Spring和使用Spring的区别看看他能做些什么。
某个UserServiceImp通过调用某一个UserDao接口实现类(有好几个)来对User类的对象进行保存,更新操作:
(1)未用Spring时
创建一个User类包含name属性。
创建Dao接口
public interface UserDao {
public void save(User user);
public void update(User user);
}
创建两个Dao接口的实现类UserDaoImp1和UserDaoImp2(改为调用UserDaoImp2):
public class UserDaoImp1 implements UserDao {
@Override
public void save(User user) {
System.out.println(user.getName() + ":save!, " + "调用UserDaoImp1 " );
}
@Override
public void update(User user) {
System.out.println(user.getName() + ":updata!, " + "调用UserDaoImp1 " );
}
}
。。。
创建UserServiceImp调用其中一个Dao实现类
public class UserServiceImp {
private UserDao userdao;
public UserDao getUserdao() {
return userdao;
}
public void setUserdao(UserDao userdao) {
this.userdao = userdao;
}
public void add(User user) {
userdao = new UserDaoImp1();
userdao.save(user);
}
public void modify(User user) {
userdao = new UserDaoImp1();
userdao.update(user);
}
}
最后创建一个Junit测试单元
public class UserServiceImpTest {
User user;
@Before
public void setUp() throws Exception {
user = new User(1,"test");
}
@Test
public void testAdd() {
UserServiceImp userServiceImp = new UserServiceImp();
userServiceImp.add(user);
}
@Test
public void testModify() {
UserServiceImp userServiceImp = new UserServiceImp();
userServiceImp.modify(user);
}
}
结果:
test:save!, 调用UserDaoImp1
test:updata!, 调用UserDaoImp1
如果改变为UseDaoImp2,需要修改:UserServiceImp中引用的Dao实现类 UserDaoImp1 -> UserDaoImp2
(2)使用Spring:
导入Spring包
配置bean.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 分别映射userDao的两个实现类 -->
<bean id="userDaoImp1" class="org.shunly.main.UserDaoImp1"/>
<bean id="userDaoImp2" class="org.shunly.main.UserDaoImp2"/>
<!-- UserServiceImp映射的bean -->
<!--通过property标签, 配置UserDao实现类对应的bean
1 name 为当前bean的变量
2 ref 为所关联的bean的id
-->
<bean id="userServiceImp" class="org.shunly.main.UserServiceImp">
<property name="userdao" ref="userDaoImp2"></property>
</bean>
</beans>
修改UserServiceImp:
删除userdao = new UserDaoImp2();
修改UserServiceImp:
删除UserServiceImp userServiceImp = new UserServiceImp();
userServiceImp.add(user);
更改为:
ApplicationContext app = new ClassPathXmlApplicationContext("bean.xml");
UserServiceImp us = (UserServiceImp) app.getBean("userServiceImp");
us.add(user);
通过ClasspathXmlApplicationContext获取bean.xml信息,通过app.getBean创建对象
结论:Spring框架通过bean.xml对接口和类进行管理。把其中new对象的过程耦合到业务层再实现。如此设置,在代码维护的方面来说十分便捷,只要修改bean中的设置即可。
实际上,
2.Spring的几种注入方式:
public void User{
private int age;
private String name;
public User(int age, String name) {
this.age = age;
this.name = name;
}
...
}
1 属性注入:
<bean id="user" class="org.shunly.main.User">
<property name="age" value="1230"/>
<property name="name" value="ab"/>
</bean>
在标签bean下注入对象,id值作为标识符,class为全限定类名
用property标签注入属性,name对应bean类中的属性, value赋值
!注意需要有无参构造方法,否则会报错:没有发现构造器。!
!id值唯一!
2构造方法注入
<bean id="user" class="org.shunly.main.User">
<constructor-arg value="123" index="0"></constructor-arg>
<constructor-arg value="adsad" index="1"></constructor-arg>
</bean>
用constructor-arg标签声明构造器中需要赋值的属性,value为所赋的值,默认顺序为构造器中的顺序。也可以用index声明位置(0开始)、或者tpye声明数据类型。
!类型不匹配也会报错!
用constructor-arg标签也可以声明接口实现类所对应的接口,如一开始的例子:
<bean id="userServiceImp" class="org.shunly.main.UserServiceImp">
<property name="userdao" ref="userDaoImp2"></property>
</bean>
3集合类型注入:
<property id="list">
<list>
<value>...</value>
<value>...</value>
</list>
</property>
如果是Map类型:更改为<map><entry k=".." value=".."/></map>
如果是Set类型:<set><value=".."/></set>
二 明天计划的事情:
1买买买服务器
2bean还有一种注解形式的注入。
三 遇到的问题:
Spring框架学习的进度不是很快,水平有限,慢慢学习,基础得打打好。
四 收获:
1 进一步了解Spring的几种注入方式,,Spring可以通过xml配置文件来实现IoC。
2 xml配置的一些小细节,比如id唯一,class要全限定类名,否则找不到要报错。
3 Spring通过xml文件,在可扩展性方面得到了提高,不用在代码层面修改,只需要在配置文件中修改就可以管理类和接口。
评论