1. 定义Bean的注解
@Controller
@Controller("Bean的名称") 定义控制层Bean,如Action
@Service
@Service("Bean的名称") 定义业务层Bean
@Repository
@Repository("Bean的名称") 定义DAO层Bean
@Component
定义Bean, 不好归类时使用.
无论是DAO,Controller,Service三个层,都可以用这个注解,@Component,这个注解通用所有的Bean。
这个时候你可能会说了,有通常的为什么用的人少呢,那是因为MVC这个分层的设计原则,用@Repository,@Service,@Controller,这个可以区别MVC原则中的DAO,Service,Controller。便于识别。
2. 自动装配Bean (选用一种注解就可以)
// 服务层
@Service(“User”)
public class UserServiceImpl implements UserService{};
// 控制层
@Controller
public class userContriller {
@AutoWired
private UserService userService;
@Resource
private UserService userService;................ 相关逻辑..............
}
@AutoWire (spring 提供)
根据 类型 注入,AutoWired 会根据 UserService 去查找 UserService 这个类 型以及其子类型。UserServiceImpl 实现了 UserService,所以能够找到它。
不过这样有一个缺点,就是当 UserService 的实现类有两个以上的时候,这个时候不确定是哪个实现类而造成冲突,所以要用 @AutoWire 注入的时候要确保 UserService 只有一个实现类。
@Resource (J2EE 提供)
@Resource(name ="***") : name后的名字去bean元素里查找有与之相等的name属性的bean。
@Resource(type ="***") : 从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常。
@Resource : 默认情况下是按照 名称 进行匹配,如果没有找到相同名称的Bean,则会按照类型进行匹配。
有人可能会想了,这下好了,用这个是万能的了,不用管名字了,也不用管类型了,但这里还是有缺点。首先,根据这个注解的匹配效果可以看出,它进行了两次匹配,也就是说,如果你在 UserService 这个类上面写@Service ,它会怎么找呢,首先是找相同名字的,如果没有找到,再找相同类型的,而这里的 @Service 没有写名字,这个时候就进行了两次搜索,显然,速度就下降了许多。
也许你还会问,这里的 @Service 本来就没有名字,肯定是直接进行类型搜索啊。其实不是这样的,UserServiceImpl 上面如果有 @Service 默认的名字 是这个 userServiceImpl,注意看,就是把类名前面的大写变成小写,就是默认的Bean的名字了。 @Resource 根据名字搜索是这样写 @Resource("userService"),如果你写了这个名字叫 userService,那么UserServiceImpl上面必须也是这个名字,不然还是会报错。
@Autowired @Qualifie("user")
直接按照名字进行搜索,也就是说,对于 UserServiceImpl 上面 @Service 注解必须写名字,不写就会报错,而且名字必须是 @Autowired @Qualifie("user") 保持一致。如果 @Service 上面写了名字,而 @Autowired @Qualifie() ,一样会报错。
3. 定义Bean的作用域和生命过程
@Scope("prototype")
值有 : singleton,prototype,session,request,session,globalSessio
@PostConstruct
相当于 init-method ,使用在方法上,当Bean初始化时执行。
@PreDestroy
相当于 destory-method ,使用在方法上,当Bean销毁时执行。