一. @Component注解
1. @Component注解, 组件的意思, 修饰一个类, 有一个value属性, 可以给组件指定一个名字。相当于我们在Spring的XML配置文件里, 配置了一个bean, 给bean指定了一个名字, 并指定类。
2. @Component注解有三个衍生注解, 功能类似, 推荐使用:
2.1. @Controller: 修饰Web层类。
2.2. @Service: 修饰service层类。
2.3. @Repository: 修饰dao层类。
二. 属性注解
1. 普通属性注解: @Value设置普通属性的值。
2. 对象属性
2.1. @Autowired: 设置对象类型属性的值。但是是按照类型完成属性注入的。
2.2. @Qualifier: 按照名称完成属性注入。
2.3. 通常@Autowired和@Qualifier注解配合使用, 完成对象类型属性的按名称注入。
2.4. @Resource: 完成对象类型属性的按名称注入。一个注解完成了@Autowired和@Qualifier两个注解所做的事情, 推荐使用。
三. IOC注解例子
1. 新建一个名为IOCAnnotation的Java工程, 拷入相关jar包
2. 新建一个名为UserDao.java的接口
package com.lywgames.dao;
public interface UserDao {
public void save();
}
3. 新建一个名为UserDaoImpl.java的类实现UserDao.java接口
package com.lywgames.dao.impl;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import com.lywgames.dao.UserDao;
@Component(value="userDao")
// 相当于我们在Spring的XML配置了一个bean,<bean name="userDao" class="com.lywgames.dao.impl.UserDaoImpl"/>
public class UserDaoImpl implements UserDao {
@Value("张三") // 注册普通属性
private String name;
@Override
public void save() {
System.out.println("保存" + name + "成功。");
}
}
4. 新建一个名为UserService.java的接口
package com.lywgames.service;
public interface UserService {
public void save();
}
5. 新建一个名为UserServiceImpl.java的类实现UserService.java接口
package com.lywgames.service.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import com.lywgames.dao.UserDao;
import com.lywgames.service.UserService;
@Component(value="userService") // 相当于我们在XML配置了一个bean,<bean name="userService" class="com.lywgames.service.impl.UserServiceImpl"/>
public class UserServiceImpl implements UserService {
@Autowired // 注册对象类型
@Qualifier(value="userDao") // 按照名称完成属性注入
private UserDao userDao;
@Override
public void save() {
userDao.save();
}
}
6. 新建一个名为UserAction.java的类
package com.lywgames.web.action;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.lywgames.service.UserService;
public class UserAction {
public static void main(String[] args) {
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = applicationContext.getBean(UserService.class);
userService.save();
applicationContext.close();
}
}
7. 在src目录下创建applicationContext.xml
8. 运行项目
四. Bean生命周期和作用域注解
1. 生命周期相关的注解
1.1. 初始化方法的注解@PostConstruct
1.2. 销毁方法的注解@PreDestroy
2. bean作用范围的注解@Scope
2.1. @Scope的值
2.1.1. singleton: 默认单例。
2.1.2. prototype: 多例。
2.1.3. request: 应用在web项目中, Spring创建这个类的对象以后, 将这个对象存入到request范围中。
2.1.4. session: 应用在web项目中, Spring创建这个类的对象以后, 将这个对象存入到session范围中。
2.2. 添加@Scope注解
五. Bean生命周期和作用域注解
1. 新建一个名为IOCAnnotationLifeCycle的Java工程, 拷入相关jar包
2. 新建一个名为UserDao.java的接口
package com.lywgames.dao;
public interface UserDao {
public void save();
}
3. 新建一个名为UserDaoImpl.java的类实现UserDao.java接口
package com.lywgames.dao.impl;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Repository;
import com.lywgames.dao.UserDao;
@Repository(value="userDao") // 相当于我们在XML配置了一个bean,<bean name="userDao" class="com.lywgames.dao.impl.UserDaoImpl"/>
@Scope(value="prototype")
public class UserDaoImpl implements UserDao {
@Value("张三") // 注册普通属性
private String name;
public UserDaoImpl() {
System.out.println("UserDaoImpl被创建了");
}
@PostConstruct
public void init() {
System.out.println("UserDaoImpl被初始化了");
}
@Override
public void save() {
System.out.println("保存" + name + "成功。");
}
@PreDestroy
public void destroy() {
System.out.println("UserDaoImpl被销毁了");
}
}
4. 新建一个名为UserService.java的接口
package com.lywgames.service;
public interface UserService {
public void save();
}
5. 新建一个名为UserServiceImpl.java的类实现UserService.java接口
package com.lywgames.service.impl;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import com.lywgames.dao.UserDao;
import com.lywgames.service.UserService;
@Service(value="userService") // 相当于我们在XML配置了一个bean,<bean name="userService" class="com.lywgames.service.impl.UserServiceImpl"/>
public class UserServiceImpl implements UserService {
@Resource(name="userDao") // 完成对象的按名称注入
private UserDao userDao;
@Override
public void save() {
userDao.save();
}
}
6. 新建一个名为UserAction.java的类
package com.lywgames.web.action;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.lywgames.service.UserService;
public class UserAction {
public static void main(String[] args) {
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = applicationContext.getBean(UserService.class);
userService.save();
applicationContext.close();
}
}
7. 在src目录下创建applicationContext.xml
8. 运行项目
六. XML方式和注解方式
1. XML方式和注解方式比较
| 基于XML配置 | 基于注解配置 |
Bean定义 | <bean id="" class=""/> | @Component: 修饰一个类
@Component的衍生类 @Controller: 修饰Web层类 @Service: 修饰service层类 @Repository: 修饰dao层类 |
Bean名称 | 通过id或name指定 | @Component(value="") |
Bean注入 | 构造函数注入: <constructor-arg name="id" value="101"/> 属性注入: <property name="id" value="102"/> p命名空间: <bean p:id="" p:teacher-ref=""/> SpEL表达式: <property name=="" value="#{}"/> | @Autowired: 按类型注入 @Qualifier(value=""): 按照名称完成属性注入
@Resource(name=""): 完成对象类型属性的按名称注入 |
声明周期 | <bean init-method="" destroy-method=""/> | @PostConstruct初始化 @PreDestroy销毁 |
Bean作用范围 | <bean scope=""/> | @Scope(value="") |
适用场景 | 适用性更广, 结构更加清晰。 | 适用类是自己定义, 开发更方便。 |
2. XML和注解的整合开发
2.1. XML定义类
2.2. 注解属性注入
七. XML和注解的整合开发例子
1. 新建一个名为IOCXMLAnnotation的Java工程, 拷入相关jar包
2. 新建一个名为UserDao.java的接口
package com.lywgames.dao;
public interface UserDao {
public void save();
}
3. 新建一个名为UserDaoImpl.java的类实现UserDao.java接口
package com.lywgames.dao.impl;
import org.springframework.beans.factory.annotation.Value;
import com.lywgames.dao.UserDao;
public class UserDaoImpl implements UserDao {
@Value("张三") // 注册普通属性
private String name;
@Override
public void save() {
System.out.println("保存" + name + "成功。");
}
}
4. 新建一个名为UserService.java的接口
package com.lywgames.service;
public interface UserService {
public void save();
}
5. 新建一个名为UserServiceImpl.java的类实现UserService.java接口
package com.lywgames.service.impl;
import javax.annotation.Resource;
import com.lywgames.dao.UserDao;
import com.lywgames.service.UserService;
public class UserServiceImpl implements UserService {
@Resource(name="userDao") // 完成对象的按名称注入
private UserDao userDao;
@Override
public void save() {
userDao.save();
}
}
6. 新建一个名为UserAction.java的类
package com.lywgames.web.action;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.lywgames.service.UserService;
public class UserAction {
public static void main(String[] args) {
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = applicationContext.getBean(UserService.class);
userService.save();
applicationContext.close();
}
}
7. 在src目录下创建applicationContext.xml
8. 运行项目