spring入门笔记--spring注解
spring原始注解

下面以注解来替换xml中的
改造前:
<bean id="userDao" class="com.yihao.dao.impl.UserDaoImpl"/>
<bean id="userService" class="com.yihao.service.impl.UserSeriveImpl">
<property name="userDao" ref="userDao"/>
</bean>
改造后:
UserDaoImpl.java
@Component("userDao") //<bean id="userDao" class="com.yihao.dao.impl.UserDaoImpl"/>
public class UserDaoImpl implements UserDao {
public UserDaoImpl(){
System.out.println("UserDaoImpl saving...");
}
public void save() {
System.out.println("saving...");
}
}
UserSeriveImpl.java
@Component("userService") //<bean id="userService" class="com.yihao.service.impl.UserSeriveImpl">
public class UserSeriveImpl implements UserService {
@Autowired
@Qualifier("userDao") //<property name="userDao" ref="userDao"/> Qualifier注解也可以删掉,默认按数据类型注入。
private UserDao userDao;
public void setUserDao(UserDao userDao) { //注解后set方法可以删掉
this.userDao = userDao;
}
@Override
public void save() {
this.userDao.save();
}
}
applicationContext.xml
<!--配置组件扫描-->
<context:component-scan base-package="com.yihao"></context:component-scan>
小结
<bean id="userDao" class=""/> 相当于 @Component("userDao")
<property name="userDao" ref="userDao"/> 相当于@Autowired @Qualifier("userDao")
- Repository,component,service,constroller功能是类似的,相互替换也不影响运行。
- @Autowired是spring默认按照数据类型从容器中匹配bean的。容器中有多个相同类型的bean,比如数据类型是一个抽象类或接口,有多个子类,这种情况要使用@Qualifier
- @Qualifier("userDao")是结合@Autowired使用,按照id值从容器中进行匹配。
- @Resource(name="userDao")相当于@Qualifier+@Autowired。
- @Value注入普通属性,例如:
@Value("value") //@Value("${jdbc.driver}")或者引用容器中的值,更常见。
private String test;
- @scope("singleton")单例或者prototype等
@PostConstruct
public void init(){
System.out.println("初始化成功");
}
@PreDestroy
public void destroy(){
System.out.println("销毁成功");
}
对比参考之前的文章Spring入门笔记
spring新注解

通过新注解可以实现全注解开发,不需要xml文件。
| xml中配置项 | 新注解 |
|---|---|
| <context:component-scan base-package="com.yihao"> | @ComponentScan("com.yihao") |
| <import resource=""> | @Import({DataSourceConfiguration.class}) |
| <context:property-placeholder location="classpath:jdbc.properties"/> | @PropertySource("classpath:jdbc.properties") |
| <bean id="databaseTest" class=""> | @Bean("dataSource") |
比如,使用SpringConfiguration作为配置类,替代applicationContext.xml
@Configuration //标志该类是Spring的核心配置类
//<context:component-scan base-package="com.yihao"></context:component-scan>
@ComponentScan("com.yihao")
//<import resource=""/>
@Import({DataSourceConfiguration.class})
public class SpringConfiguration { }
//<context:property-placeholder location="classpath:jdbc.properties"/>
@PropertySource("classpath:jdbc.properties")
public class DataSourceConfiguration {
@Value("${jdbc.driver}")
private String driver;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
@Bean("dataSource") //spring会将当前方法返回值以指定名称存储到spring容器中,即xml中的bean id。
public DataSource getDataSource(){ //按照驼峰命名,下面测试方法都会默认隐式调用该方法
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(driver);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
return dataSource;
}
}
测试时:
//方式一,普通的测试类
@Test
public void test2() throws SQLException {
ApplicationContext app = new AnnotationConfigApplicationContext(SpringConfiguration.class);
UserService service = (UserService)app.getBean("userService");
service.save();
//数据库连接
DruidDataSource dataSource = (DruidDataSource) app.getBean("dataSource");
Connection connection = dataSource.getConnection();
}
//方式二,使用junit
@RunWith(SpringJUnit4ClassRunner.class)
//@ContextConfiguration("classpath:applicationContext.xml")
@ContextConfiguration(classes = {SpringConfiguration.class})
public class SpringJunitTest {
@Autowired
private UserService userService;
@Autowired
@Qualifier("dataSource1")
private DruidDataSource dataSource;
@Test
public void test1() throws SQLException {
userService.save();
System.out.println(dataSource.getConnection());
}
}
浙公网安备 33010602011771号