1.看代碼,下面是一個類
下面主要紅色字體部分的屬性
package com.westsoft.serviceimpl;
import java.util.List;
import javax.annotation.Resource;
import javax.sql.DataSource;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import com.westsoft.bean.Person;
import com.westsoft.dao.PersonDao;
import com.westsoft.service.PersonService;
@Service @Transactional
public class PersonServiceBean implements PersonService {
private JdbcTemplate jdbcTemplate;
@Resource
public void setJdbcTemplate(DataSource dataSource) {
this .jdbcTemplate = new JdbcTemplate(dataSource);
}
@Resource
private PersonDao personDao;
/*
public PersonDao getPersonDao() {
return personDao;
}
public void setPersonDao(PersonDao personDao) {
this.personDao = personDao;
} */
@Override
public void delete(Integer id) {
// TODO Auto-generated method stub
}
@Override
public Person getPerson(Integer id) {
// TODO Auto-generated method stub
return null;
}
@Override @Transactional(propagation=Propagation.NOT_SUPPORTED)
public List<Person> getPersons() {
// TODO Auto-generated method stub
return null;
}
/*
* 新增
* @Transactional(rollbackFor=Exception.class)
* RuntimeException運行期例外,默認回滾
* Exception 非運行期例外,不回滾
* @Transactional(rollbackFor=Exception.class)
* @Transactional(propagation=Propagation.NOT_SUPPORTED):不開啟事務
* @Transactional(propagation=Propagation.REQUIRED):默認事務行為,如果方法運行時已經處在一個事務中,則加入該事務,
* 否則為自己創建一個事務
* @Transactional(propagation=Propagation.REQUIREDNEW):必須開啟一個新事務,事務中嵌套事務
* @Transactional(propagation=Propagation.SUPPORTS):如果方法在已存在的事務中執行,則加入該事務,如果不在事務中執行,
* 則方法在沒有事務的環境下執行.
* @Transactional(propagation=Propagation.MANDATORY):指定方法只能在已有的事務中執行,不會自動創建事務,如果沒有在事務
* 中執行,則拋出異常.
* @Transactional(propagation=Propagation.NEVER):不能在事務中執行,否則拋出異常
*
* @Transactional(propagation=Propagation.NESTED):
*
*/
@Override @Transactional(propagation=Propagation.REQUIRED)
public void save(String name) throws Exception {
// TODO Auto-generated method stub
this.jdbcTemplate.update("insert into person(name) values(?)", new Object[]{name},
new int[]{java.sql.Types.VARCHAR});
// throw new RuntimeException("運行期例外");
}
@Override
public void update(Person person) {
// TODO Auto-generated method stub
}
}
public void setJdbcTemplate(DataSource dataSource) {
this
.jdbcTemplate =
new
JdbcTemplate(dataSource);
}
}
2.單元測試代碼
PropertyDescriptor[] ps = Introspector.getBeanInfo(PersonServiceBean.
class).getPropertyDescriptors();
for(PropertyDescriptor properdesc : ps){
System.out.println(properdesc.getName()+":"+properdesc.getPropertyType());
}
for(PropertyDescriptor properdesc : ps){
System.out.println(properdesc.getName()+":"+properdesc.getPropertyType());
}
3.測試輸出
class:
class java.lang.Class
jdbcTemplate: interface javax.sql.DataSource
persons: interface java.util.List
jdbcTemplate: interface javax.sql.DataSource
persons: interface java.util.List
根據輸出的內容可以判斷出屬性的名稱是jdbcTemplate,屬性的數類型是javax.sql.DataSource
由此可見類的屬性的類型並不是由屬性所關聯的字段的類型決定的,而是由傳入的參數的類型決定的
4.如果有getAaa則屬性的類型由getAaa的返回值決定,如下代碼
package com.westsoft.serviceimpl;
import java.util.List;
import javax.annotation.Resource;
import javax.sql.DataSource;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import com.westsoft.bean.Person;
import com.westsoft.dao.PersonDao;
import com.westsoft.service.PersonService;
@Service @Transactional
public class PersonServiceBean implements PersonService {
private String bbb;
public Integer getAaa() {
return 0;
}
public void setAaa(Integer aaa) {
this .bbb = (String)aaa.toString();
}
private JdbcTemplate jdbcTemplate;
public JdbcTemplate getJdbcTemplate() {
return this .jdbcTemplate ;
}
@Resource
public void setJdbcTemplate(DataSource dataSource) {
this .jdbcTemplate = new JdbcTemplate(dataSource);
}
@Resource
private PersonDao personDao;
/*
public PersonDao getPersonDao() {
return personDao;
}
public void setPersonDao(PersonDao personDao) {
this.personDao = personDao;
} */
@Override
public void delete(Integer id) {
// TODO Auto-generated method stub
}
@Override
public Person getPerson(Integer id) {
// TODO Auto-generated method stub
return null;
}
@Override @Transactional(propagation=Propagation.NOT_SUPPORTED)
public List<Person> getPersons() {
// TODO Auto-generated method stub
return null;
}
/*
* 新增
* @Transactional(rollbackFor=Exception.class)
* RuntimeException運行期例外,默認回滾
* Exception 非運行期例外,不回滾
* @Transactional(rollbackFor=Exception.class)
* @Transactional(propagation=Propagation.NOT_SUPPORTED):不開啟事務
* @Transactional(propagation=Propagation.REQUIRED):默認事務行為,如果方法運行時已經處在一個事務中,則加入該事務,
* 否則為自己創建一個事務
* @Transactional(propagation=Propagation.REQUIREDNEW):必須開啟一個新事務,事務中嵌套事務
* @Transactional(propagation=Propagation.SUPPORTS):如果方法在已存在的事務中執行,則加入該事務,如果不在事務中執行,
* 則方法在沒有事務的環境下執行.
* @Transactional(propagation=Propagation.MANDATORY):指定方法只能在已有的事務中執行,不會自動創建事務,如果沒有在事務
* 中執行,則拋出異常.
* @Transactional(propagation=Propagation.NEVER):不能在事務中執行,否則拋出異常
*
* @Transactional(propagation=Propagation.NESTED):
*
*/
@Override @Transactional(propagation=Propagation.REQUIRED)
public void save(String name) throws Exception {
// TODO Auto-generated method stub
this.jdbcTemplate.update("insert into person(name) values(?)", new Object[]{name},
new int[]{java.sql.Types.VARCHAR});
// throw new RuntimeException("運行期例外");
}
@Override
public void update(Person person) {
// TODO Auto-generated method stub
}
}
5.測試輸出
注意紅色部分
public Integer getAaa() {
return
0;
}
}
publicvoid setAaa(Integer aaa) {
this.bbb = (String)aaa.toString();
}
通過反射測試出屬性的數據類型為
aaa:class java.lang.Integer
class:
class java.lang.Class
jdbcTemplate: class org.springframework.jdbc.core.JdbcTemplate
persons: interface java.util.List
jdbcTemplate: class org.springframework.jdbc.core.JdbcTemplate
persons: interface java.util.List
6.總結
在沒有getAaa的情況下,屬性的數據類型是有setAaa的傳入參數決定,如果有getAaa則屬性的數據類型有getAaa的返回類型決定.