Spring基礎學習筆記(六)
阿新 • • 發佈:2018-12-30
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);
}
}
執行結果