目录
1.创建Spring项目
1.1创建一个Maven项目
1.2添加spring的框架支持
在pom.xml中添加框架支持的依赖:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
</dependencies>
从配置看,添加的框架有,spring-context: spring 上下文,spring-beans: 管理对象模块
2.存储Bean对象
存储Bean对象主要分为两步:
- 如果存在Bean对象则直接使用,没有则需要创建Bean对象
- 将Bean对象注册到容器当中
2.1创建Bean对象
Bean对象在Java中来说,就是一个普通对象 ,我们创建一个普通的对象即可。
public class User {
public String sayHi(String name) {
return name + " hello!";
}
}
2.2将对象注册到容器当中
在创建好的项目中添加 Spring 配置文件 spring-config.xml,将此文件放到 resources 的根目录下,如下图所示:
具体配置内容如下:
<?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>
再将User对象注册到spring中就可以具体操作如下:
<beans>
<bean id="user" class="com.bit.User"></bean>
</beans>
此时就是将Bean对象注册到spring中了。
3.获取并使用Bean对象
获取并使用Bean对象分为三个步骤:
- 得到spring上下文对象,因为所有的Bean对象都由spring管理,所以要获取,就首先要获取到spring的上下文
- 通过spring上下文,获取一个指定的Bean对象
- 对对象进行使用
3.1获取spring上下文对象
ApplicationContext context = new ClassPathXmlApplicationContext(
"spring-config.xml");
除了使用ApplicaitonContext,还可以使用BeanFactory
BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource(
"springconfig.xml"));
ApplicationContext 和 BeanFactory 效果是一样的,ApplicationContext 属于 BeanFactory 的子类
3.2获取指定的Bean对象
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
User user = (User) context.getBean("user");
System.out.println(user);
此时就获取到了所注册到spring中的Bean对象。
注意:
3.3使用Bean对象
User user = (User) context.getBean("user");
System.out.println(user.sayHi("悟空!!!"));
System.out.println(user);
}
更简单的存储和读取对象
之前我们已经了解了spring读取和存储对象的操作了,相对来说比较简单,但是其中一些操作还是比较复杂。所以我们学习更加简答的方法来实现存储和读取——注解
1.前置工作——配置扫描路径
要将对象成功存储到spring,首先要配置正确的路径。只有被配置包下的所有类,添加了注解才能被正确的识别并保存到spring中。
在 spring-config.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"
xmlns:content="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!--设置需要存储到spring中的bean根目录-->
<content:component-scan base-package="com.example"></content:component-scan>
</beans>
2.添加注解存储Bean对象
添加注解存储对象主要分为两种类注解和方法注解
类注解:
- Controller(控制器存储):做web开发使用,专门对web的请求响应进行处理
- Service(服务存储):做业务逻辑,为项目提供服务
- Repository(仓库存储):做数据访问操作,一般指操作数据库
- Component(组件存储):值一般组件,如果不属于以上三个功能,就是用这个注解
- Configuration(配置存储):企业级/大型项目启动时,需要加载配置很多东西,就需要用到
方法注解:
- Bean:将所需要存储的方法进行注解
2.1为什么有这么多注解
不同的注解可以表明每一个类不同的作用,就如车牌一样,不同地区的车牌不一样,很容易区分。同样的注解也是达到这个目的,就可以明白每个类的作用是什么样的,编程人员一目了然。
2.2Controller(控制器存储)
演示Controller,其余的四个类注解工作方式一样
@Controller
public class UserController {
public void sayHi(String name){
System.out.println("Hi " + name + "!!!!");
}
}
ApplicationContext context = new AnnotationConfigApplicationContext("com.example");
UserController userController = (UserController) context.getBean("userController");
userController.sayHi("UserController");
System.out.println(userController);
其他四个类注解可以用同样的方式来实现
2.3注意Bean的命名
由于我们创建Beany一般都用的是大驼峰命名,所以在我们获取的时候就可以直接小写首字母就可
但是如果Bean的命名并非驼峰式,再使用小写首字母,就会出现报错 :
所以此时要明白,如果出现这种情况,那么就两个字母都要大写:
2.4方法注解
@Component
@Data
public class User {
private String name;
private int age;
@Bean
public User u1(){
User user = new User();
user.setName("张三");
user.setAge(20);
return user;
}
}
此时主方法就可以直接通过方法名获取方法
注意 :方法注解一定搭配类注解来使用,不然会直接报错!!!
上述代码,有我们熟悉的代码,但是其中一个注解不了解,那就是@Data注解!
@Data//这是lombok注解,可以自动生成属性的getter/setter,equals/hashcode,toString
如果加上该注解,就可以省去我们自己手动编写getter/setter等方法。
2.5可以通过name属性给Bean重命名
@Bean(name = {"u2"})
public User u1(){
User user = new User();
user.setName("张三");
user.setAge(20);
return user;
}
User u1 = (User) context.getBean("u2");
System.out.println(u1);
此时就可以通过访问u2来获取Bean
3.对象的注入
对象的注入主要分为两种:
- 属性注入
- 构造方法注入
属性注入是使用 @Autowired 实现的.
3.1属性注入
例如将User属性注入到Person
@Component
public class Person {
@Autowired
private User user;
public User getUser() {
return user.u1();
}
}
Person person = (Person) context.getBean("person");
System.out.println(person.getUser());
此时是通过获取Person对象,然后间接获取到了User对象,这说明注入成功。
3.2构造方法注入
@Component
public class Person {
private User user;
@Autowired
public Person(User user){
this.user = user;
}
}
其实还有第三种方法,是setter注入,和构造方法注入类似,就是将属性作为setter的参数来使用
4.@Resource:另一种注入关键字
他和@Autowired关键字的作用相同,都是注入注解,
两者不同的点是:
- 来源不同: @Autowired是来自spring,而@Resource是来源于JDK
- 使用时设置参数不同:相比于@Autowired,@Resource更加的灵活,可以设置更多的参数,比如设置不同的name ,可以根据名称来获取。