1.Spring原始注解
Spring是轻代码而重配置的框架,配置比较繁重,影响开发效率,所以注解开发是一种趋势,注解代替xml配置文件可以简化配置,提高开发效率。
任何一套框架,现在都是两套配置,一套是xml配置,一套是注解配置
Spring原始注解主要是替代<Bean>的配置


(1)之前用xml配置的方式

dao层:
UserDao
package com.company.dao;
public interface UserDao {
public void save();
}
UserDaoImpl
package com.company.dao.impl;
import com.company.dao.UserDao;
public class UserDaoImpl implements UserDao {
public void save() {
System.out.println("save running...");
}
}
Service层:
UserService
package com.company.service;
public interface UserService {
public void save();
}
UserServiceImpl
package com.company.service.impl;
import com.company.dao.UserDao;
import com.company.service.UserService;
public class UserServiceImpl implements UserService {
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void save(){
userDao.save();
}
}
Controller层(web层)
package com.company.web;
import com.company.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class UserController {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = applicationContext.getBean(UserService.class);
userService.save();
}
}
applicationContext.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">
<bean id="userDao" class="com.company.dao.impl.UserDaoImpl"></bean>
<bean id="userService" class="com.company.service.impl.UserServiceImpl">
<property name="userDao" ref="userDao"></property>
</bean>
</beans>
运行结果:

(2)现在通过注解的方式(原始注解):
使用注解进行开发时,需要在applicationContext.xml中配置组件扫描,作用是指定哪个包及其子包下的Bean需要进行扫描以便识别使用注解配置的类、字段和方法


UserDaoImpl中:

UserServiceImpl中:

(3)使用@Controller,@Service,@Repository替代@Component
我们看到@Component时,不能意识到它属于哪一层, 使用@Controller,@Service,@Repository语义可以更加明确知道属于哪一层,它们三个的使用方式和@Component一样的



注意:如果使用xml配置的方式set方法需要写的,如果使用注解的方式,set方法可以不写

@Qualifier("userDao")去掉仍然可以,直接单独使用@Autowired就可以了,为什么呢?
因为@Autowired按照数据类型从Spring容器中进行匹配的
在userDao上面加了一个@Autowired,Spring扫到这个注解之后,会尝试从Spring容器找到UserDao类型的Bean,找到之后,直接给你注到这个地方
@Autowired 注释,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。 通过 @Autowired的使用来消除 set ,get方法。在使用@Autowired之前,我们对一个bean配置起属性时,是这样用的
<property name="属性名" value=" 属性值"/>
通过这种方式来,配置比较繁琐,而且代码比较多。在Spring 2.5 引入了 @Autowired 注释

如果现在不想按照类型匹配,我想按照名称匹配

这样可以用@Resource


(4)注入普通数据类型,用@Value


运行结果:

用SpEL(spring表达式)可以获取Spring容器中那个key指定的值,key如果匹配成功,可以将值赋给下面的driver,即${jdbc.driver}

运行结果:

(5)@scope产生单例或者多例的Bean


(6)使用@PostConstruct和@PreDestroy

package com.company.service.impl;
import com.company.dao.UserDao;
import com.company.service.UserService;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;
// <bean id="userService" class="com.company.service.impl.UserServiceImpl">
// @Component("userService")
@Service("userService")
@Scope("singleton")
// @Scope("prototype")
public class UserServiceImpl implements UserService {
@Value("${jdbc.driver}")
private String driver;
@Resource(name="userDao")
private UserDao userDao;
public void save(){
System.out.println(driver);
userDao.save();
}
@PostConstruct // 在构造器执行之后(创建对象之后),执行这个初始化方法
public void init() {
System.out.println("Service对象初始化方法。。。");
}
@PreDestroy
public void destroy() {
System.out.println("Service对象销毁方法。。。");
}
}

运行结果:
