1. 程式人生 > >Spring基礎學習筆記(六)

Spring基礎學習筆記(六)

Bean節點id,class定義小結

 

1.定義id,class,常用

<bean id="sessionFactory"  class="cn.mytest.spring.day1.h_di2.SessionFactory"  /> 

  class裡面寫的是全限定類名,而且不能是抽象類,不能是介面

//預設的構造方法
Class.forName("cn.mytest.spring.day1.h_di2.SessionFactory").newInstance();

2.定義id,abstract="true",常用

如果bean已經定義了abstract="true",就表示此bean不例項,class就失效了

<bean id="baseDao" abstract="true">
     <property name="sessionFactory"  ref="sessionFactory"/>
      <property name="sessionFactory1"  ref="sessionFactory"/>
  </bean>

3.宿主bean,不定義id,類似於java的匿名內部類

     <property name="myBeanList">
             <list>
                <!-- 引用上面的bean物件 -->
                <ref bean="myBean"/>
                <!-- 宿主bean  -->
                <bean class="cn.mytest.spring.day1.h_di2.MyBean"></bean>
            </list>     
     </property>

 

bean屬性的繼承

 

<bean id="sessionFactory"  class="cn.mytest.spring.day1.h_di2.SessionFactory"  /> 

 

 Spring bean屬性的繼承和java程式碼的繼承沒有任何關係 

 原來(bean.xml)

     <!--方案1 沒有抽取注入屬性 -->
	<bean id="userDao" class="cn.itsource.spring.day1.h_di2.UserDao">
	    <property name="sessionFactory" ref="sessionFactory"/>
	</bean>
	
    <bean id="deptDao" class="cn.itsource.spring.day1.h_di2.DeptDao">
	    <property name="sessionFactory" ref="sessionFactory"/>
	</bean> 

現在:抽取後(bean.xml)

 <!--方案2:抽取注入屬性 -->
  <bean id="baseDao" abstract="true">
     <property name="sessionFactory"  ref="sessionFactory"/>
      <property name="sessionFactory1"  ref="sessionFactory"/>
  </bean>

  <!-- 其中沒有依賴,自結束 -->
  <!-- parent==bean.id:繼承哪個bean的屬性 -->
 <bean id="userDao"  class="cn.mytest.spring.day1.h_di2.UserDao"  parent="baseDao"/> 
 <bean id="deptDao"  class="cn.mytest.spring.day1.h_di2.DeptDao"  parent="baseDao"/> 

 

 

java的程式碼在上一篇的基礎上做如下修改:

 

SessionFactory

public class SessionFactory {

}

 

BaseDao

public class BaseDao {

	protected SessionFactory sessionFactory;
	protected SessionFactory sessionFactory1;

	public void setSessionFactory(SessionFactory sessionFactory) {
		this.sessionFactory = sessionFactory;
	}

	public void setSessionFactory1(SessionFactory sessionFactory1) {
		this.sessionFactory1 = sessionFactory1;
	}

}

 

Dept

public class Dept {

	private int id;

	private String name;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public String toString() {
		return "Dept [id=" + id + ", name=" + name + "]";
	}

}

DeptDao

public class DeptDao extends BaseDao {

	public void save(User user) {
		System.out.println("dao:" + sessionFactory);
		user.setId(100);
		System.out.println("dao:" + user);
	}

}

 

UserDao

public class UserDao extends BaseDao {

	public void save(User user) {
		System.out.println("dao:" + sessionFactory);
		user.setId(100);
		System.out.println("dao:" + user);
	}

}

 

UserService

public class UserService {

	// 原來
	// private UserDao userDao = new UserDao();

	// spring,userDao例項化交給spring來管理
	// 要與bean.xml中userService中配置注入的name一致
	private UserDao userDao;
	private DeptDao deptDao;

	public void setUserDao(UserDao userDao) {
		this.userDao = userDao;
	}

	public void setDeptDao(DeptDao deptDao) {
		this.deptDao = deptDao;
	}

	public void save(User user) {
		System.out.println("service:" + user);
		System.out.println("service:" + user.getDept());
		userDao.save(user);
	}

}

 

MainTest


@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("bean.xml")
public class MainTest {

	// 註解的spring測試方式 註解注入
	@Autowired
	UserAction userAction;

	@Test
	public void testName() throws Exception {

		User user = new User();
		user.setName("xxx");

		Dept dept = new Dept();
		dept.setName("dept");// user.dept.name

		// 手動建立關係
		user.setDept(dept);
		userAction.setUser(user);
		String result = userAction.save();
		System.out.println("返回檢視名稱:" + result);

	}

}

 

執行結果