spring创建与使用

  1. 操作容器之前,先要有容器,所以先要得到容器。
  2. 存对象
  • a. 创建 Bean(普通类)。
  • b. 将 Bean 注册(配置)到 spring-confing.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">
</beans>
  1. 取对象
  • a. 得到 Spring 上下⽂,并读取到 Spring 的配置⽂件。
  • b. 获取某⼀个 Bean 对象。
  • c. 使⽤ Bean 对象。
public static void main(String[] args) {
    ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
    //1. 通过getBean(String var1)获取对象
    User user = (User)context.getBean("user");
    user.sayHi();
    //2. 通过 getBean(Class<T> var1) 来获取对象
    User user2 = context.getBean(User.class);
    user2.sayHi();
    //3. 通过 getBean(String var1, Class<T> var2)来获取bean
    User user3 = context.getBean("user",User.class);
    user3.sayHi();

}
<bean id="user" class="com.bite.User">
  <constructor-arg name="name" value="zhangsan"></constructor-arg>
</bean>

ApplicationContext VS BeanFactory(常⻅⾯试题)

  • 继承关系和功能⽅⾯来说:Spring 容器有两个顶级的接⼝:BeanFactory 和ApplicationContext。其中 BeanFactory 提供了基础的访问容器的能⼒,⽽ ApplicationContext 属于 BeanFactory 的⼦类,它除了继承了 BeanFactory 的所有功能之外,它还拥有独特的特性,还添加了对国际化⽀持、资源访问⽀持、以及事件传播等⽅⾯的⽀持。
  • 从性能⽅⾯来说:ApplicationContext 是⼀次性加载并初始化所有的 Bean 对象,⽽ BeanFactory 是需要那个才去加载那个,因此更加轻量

⽽ ClassPathXmlApplicationContext 属于 ApplicationContext 的⼦类,拥有 ApplicationContext 的所有功能,是通过 xml 的配置来获取所有的 Bean 容器的。
1689928893511.png

@RestController = @Repository + @Repository
1690184195712.png
类注解:@Controller、@Service、@Repository、@Component、@Configuration。
⽅法注解:@Bean。
1689985779889.png

对象装配(对象注⼊)(@Autowired)的实现⽅法以下 3 种:

  1. 属性注⼊
  2. 构造⽅法注⼊
  3. Setter 注⼊

三种注⼊优缺点分析

  • 属性注⼊的优点是简洁,使⽤⽅便;缺点是只能⽤于 IoC 容器,如果是⾮ IoC 容器不可⽤,并且只

有在使⽤的时候才会出现 NPE(空指针异常)。

  • 构造⽅法注⼊是 Spring 推荐的注⼊⽅式,它的缺点是如果有多个注⼊会显得⽐较臃肿,但出现这

种情况你应该考虑⼀下当前类是否符合程序的单⼀职责的设计模式了,它的优点是通⽤性,在使⽤
之前⼀定能把保证注⼊的类不为空。

  • Setter ⽅式是 Spring 前期版本推荐的注⼊⽅式,但通⽤性不如构造⽅法,所有 Spring 现版本已

经推荐使⽤构造⽅法注⼊的⽅式来进⾏类注⼊了。

@Resource:另⼀种注⼊关键字

@Controller
public class UserController4 {
  @Resource
  private UserService userService;

  @Resource(name = "user")
  private User user1;

  public void sayHi(){
    userService.doService();
    System.out.println(user1.getName());
    System.out.println("hi, userController4...");
  }
}

@Autowired 和 @Resource 的区别

出身不同:@Autowired 来⾃于 Spring,⽽ @Resource 来⾃于 JDK 的注解;
使⽤时设置的参数不同:相⽐于 @Autowired 来说,@Resource ⽀持更多的参数设置,例如
name 设置,根据名称获取 Bean。
@Autowired 可⽤于 Setter 注⼊、构造函数注⼊和属性注⼊,⽽ @Resource 只能⽤于 Setter 注
⼊和属性注⼊,不能⽤于构造函数注⼊。
1690014888684.png

同⼀类型多个 Bean 报错处理

1690014679228.png

@Autowired
@Qualifier(value = "user")
private User user;

@Resource(name = "user")
private User user1;
  1. 将对象存储到 Spring 中:
    a. 使⽤类注解:@Controller、@Service、@Repository、@Configuration、@Component【它
    们之间的关系】
    b. 使⽤⽅法注解:@Bean【注意事项:必须配合类注解⼀起使⽤】
  2. Bean 的命名规则:⾸字⺟和第⼆个字⺟都⾮⼤写,⾸字⺟⼩写来获取 Bean,如果⾸字⺟和第⼆个
    字⺟都是⼤写,那么直接使⽤原 Bean 名来获取 Bean。
  3. 从 Spring 中获取对象:
    a. 属性注⼊
    b. Setter 注⼊
    c. 构造函数注⼊(推荐)
  4. 注⼊的关键字有:
    a. @Autowired
    b. @Resource
  5. @Autowired @Resource 区别:出身不同; 使⽤时设置参数不同 @Resource ⽀持更多的参
    数,⽐如 name。
  6. 解决同⼀类型多个 Bean 的报错:
    a. 使⽤ @Resource(name=“”)
    b. 使⽤ @Qualifier(“”)

User类

public class User {
    private String name;
    private Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

BeanConfiguration

@Configuration
public class BeanConfig {

    @Bean
    public Integer age(){
        return 11;
    }

    @Bean
    public Integer age2(){
        return 12;
    }

    @Bean(name = {"aaa","user"})
//    @Bean
    public User user(Integer age){
        User user = new User();
        user.setName("zhangsan");
        user.setAge(age);
        return user;
    }
    @Scope("prototype")
    @Bean
    public User user2(){
        User user = new User();
        user.setName("lisi");
        user.setAge(19);
        return user;
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值