发表于: 2017-09-30 23:44:00

1 767


一 今天完成的事情:

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文件,在可扩展性方面得到了提高,不用在代码层面修改,只需要在配置文件中修改就可以管理类和接口。



返回列表 返回列表
评论

    分享到