一、Spring的核心功能
spring是包含了众多方法的IoC容器,所以它有两个核心功能:
(1)将对象存储到容器中
(2)将对象从容器中取出来
二、怎样将对象存储到容器中
带你了解spring
此文章是一种将对象存储和读取的方法,现在我们还有一种更简单的方法,是通过注解将对象存储到容器中。
Spring有两类注解可以实现:
(1)类注解:@Controller、@Service、@Repository、@Component、@Configuration
(1)方法注解:@Bean
1.@Configuration是配置层的注解,存放所有配置信息
2.@Controller是控制器层注解,和前端打交道,主要验证前端结果的有效性
3.@Service是服务层的注解,主要是组织数据和调用相应的接口
4.@Repository是数据持久层的注解,主要和数据库打交道,执行具体的CURD操作
5.@Component是以上四个类注解的父类,上面四个注解都是依靠@Component实现的
6.@Bean是放在方法上的注解,是将当前方法的返回值存储到Spring中,以便在其他地方按照需求进行注入和使用。
注意:方法注解要配合类注解使用才有效果。
配置文件
<!-- beans下的所有类需要spring扫描-->
<content:component-scan base-package="com.beans"></content:component-scan>
public class User {
String name;
int id;
int age;
public void setName(String name) {
this.name = name;
}
public void setId(int id) {
this.id = id;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "id='" + id +'\'' + ","+"name='" + name + '\'' + ", age=" + age ;
}
}
@Service
public class UserService {
public User getUser(int id){
User user=new User();
user.setId(id);
user.setName("张三");
user.setAge(18);
return user;
}
}
public class Main {
public static void main(String[] args) {
ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml");
UserService userService= (UserService) context.getBean("userService");
System.out.println(userService.getUser(1));
}
}
其他四个类注解使用方法也同上。
@Bean的例子
一个接口
public interface UserService {
void addUser(User user);
}
UserServiceImpl实现了这个接口
@Service
public class UserServiceImpl implements UserService {
@Override
public void addUser(User user) {
// 添加用户逻辑
}
}
使用@Bean注解标注了一个方法。该方法返回一个UserService实例,我们可以通过调用该方法来让Spring容器管理UserService实例。我们可以在其他地方通过依赖注入的方式来使用这个实例
@Configuration
public class AppConfig {
@Bean
public UserService userService() {
return new UserServiceImpl();
}
}
@Service
public class OrderService {
@Autowired
private UserService userService;
// 其他业务逻辑
}
三、对象注入
可以通过@Autowired和@Resource实现对象注入。
@Autowired三个实现方法:
1、属性注入
@Controller
public class UserService {
@Autowired
private Repository repository;
public User getUserById(int id){
return repository.getUserById(id);
}
}
2.构造犯法注入
@Controller
public class UserController {
private Repository repository;
@Autowired
public UserController(Repository repository){
this.repository=repository;
}
public User getUserById(int id){
return repository.getUserById(id);
}
}
3.setter注入
@Controller
public class UserController {
private Repository repository;
@Autowired
public void setRepository(Repository repository){
this.repository=repository;
}
public User getUserById(int id){
return repository.getUserById(id);
}
}
三种注解的优缺点:
1.属性注入:优点是简洁,缺点是只能用于IoC容器;
2.构造方法注入:spring推荐的注入方法,优点是通用性比较强,缺点是多个注入会比较臃肿;
3.setter注入:缺点是通用性不如构造方法注入。
@Resource和@Autowired使用方法一样,但@Resource不支持构造方法注入。
@Resource和@Autowired的区别:
1.出身不同:@Resource来自JDK注解,而@Autowired来自spring;
2.参数设置不同:@Resource支持更多参数的设置,如name等。
3.支持注入类型不同:@Resource不支持构造方法注入,而@Autowired支持采属性注入、构造方法注入和setter注入。