Bean管理是做什么的?
1.创建对象 2.注入属性
我们为了解决类与类之间的耦合,我们并不会在一个类中直接创建对象,而是交给IOC,而IOC创建对象就是有Bean来管理的,类里面的变量赋值也可以通过Bean管理来进行注入属性
Bean管理操作的两种方式
1.基于xml配置文件的方式实现
2.基于注解方式实现
一、基于xml配置文件的方式实现Bean管理和注入属性
我们在创建对象,并且执行无参构造器的方法创建对象时,我们就直接在xml文件里引入bean标签
//id:类的唯一标识符,其实就是我们通过反射创建的class对象 //clss;类的全路径名(包名+类名) <bean id="demo" class="com.qcby.Demo"/>
这样我们通过IOC的工厂解析xml文件,就可以创建类
如果说我们创建一个Javabean类(有变量和get、set方法以及tostring方法) ,我们也可以通过Bean管理的注入属性对里面的变量进行赋初始值。我们创建的javabean类Demo代码如下所示;
public class Demo {
private int age;
private String name;
private User user;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Override
public String toString() {
return "Demo{" +
"age=" + age +
", name='" + name + '\'' +
", user=" + user +
'}';
}
}
以及user的Javabean类代码:
public class User {
private String[] name;
public List<String> list;
private Map<String,String> map;
public String[] getName() {
return name;
}
public void setName(String[] name) {
this.name = name;
}
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
public Map<String, String> getMap() {
return map;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
@Override
public String toString() {
return "User{" +
"name=" + Arrays.toString(name) +
", list=" + list +
", map=" + map +
'}';
}
}
里面有各种类型的数据,int、string、引用数据类型、数组、list集合和map集合,我们注入数据的bean标签在xml文件中如下:
<!‐‐DI:依赖注入‐‐>
<bean id="demo" class="com.qcby.Demo">
<!--使用property完成属性注入
name:类里面属性名称
value:向属性注入值
ref:对象映射,映射到相应类对应的bean标签id上-->
<property name="age" value="18"></property>
<property name="name" value="孙悟空"></property>
<property name="user" ref="user"></property>
</bean>
<!‐‐数组、集合写在property标签里‐‐>
<bean id="user" class="com.qcby.User">
<property name="name">
<!‐‐数组用array标签,里面的值用value标签‐‐>
<array>
<value>孙悟空</value>
<value>猪八戒</value>
<value>唐三藏</value>
</array>
</property>
<property name="list">
<!‐‐list集合用list标签,里面的值用value标签‐‐>
<list>
<value>菩提老祖</value>
<value>哪吒</value>
<value>三太子</value>
</list>
</property>
<property name="map">
<!‐‐map集合用map标签,里面的值用entry标签,map是key-value的形式,entry是map 集合的一个属性,在里面写上key,value‐‐>
<map>
<entry key="aaa" value="张三"/>
<entry key="bbb" value="李四"/>
</map>
</property>
</bean>
我们测试结果如下:
如果我们的构造函数是带参数的,我们可以通过如下代码进行在xml中进行注入:
<bean id="car" class="全类名">
<constructor-arg name="参数名1" value="注入的值"></constructor-arg>
<constructor-arg name="参数名2" value="35"></constructor-arg>
</bean>
二、基于注解的方式实现Bean管理和注入属性
因为以xml方式实现Bean管理太繁琐,现在都不常用了,常用的是用注解的方式
什么是注解:
1)注解是代码特殊标记,格式:@注解名称(属性名称=属性值)
2)使用注解:注解可以作用在类上面,方法上面,属性上面
3)使用注解的目的:简化XML配置
Spring针对Bean管理中创建对象提供的注解 :
@Component 普通的类
@Controller 表现层(和页面交互的类)
@Service 业务层 (实现业务逻辑的类)
@Repository 持久层
*上边四个功能一样,都可以用来创建bean实例
我们看如下例子:
//@Component(value = "car")
//@Controller(value = "car")
//@Service(value = "car")
@Repository(value = "car")
public class Car {
public void test(){
System.out.println("你好");
}
}
我们把注解写在类上面,它们作用相同写一个就行,但是这样还不能创建对象,还有在xml文件中写一个注解扫描,里面需要写上我们的包名,会扫描我们包里的所有文件
<!--开启注解扫描 com.qcby所有的包中的所有的类-->
<context:component-scan base-package="包名"/>
写完之后我们进行测试,如下:
那创建初始值,也就是属性注入也是可以通过注解的,有四种方式
@Value 用于注入普通类型(String,int,double等类型)
@Autowired 默认按类型进行自动装配(引用类型)
@Qualifier 不能单独使用必须和@Autowired一起使用,强制使用名称注入
@Resource Java提供的注解,也被支持。使用name属性,按名称注入
我们看如下代码,两个类分别是Car类和demo类:
//@Component(value = "car")
//@Controller(value = "car")
//@Service(value = "car")
@Repository(value = "car")
public class Car {
@Value("奥迪")
private String name;
@Value("1000")
private int age;
@Autowired
@Qualifier(value = "demo1")
// @Resource
private Demo demo;
public void test(){
System.out.println("你好");
}
@Override
public String toString() {
return "Car{" +
"name='" + name + '\'' +
", age=" + age +
", demo=" + demo +
'}';
}
}
@Component(value = "demo1")
public class Demo {
@Value("男")
private char sex;
@Override
public String toString() {
return "Demo{" +
"sex=" + sex +
'}';
}
}
输出结果:
扫描文件都是放在配置文件里,我们也可以放在类里不使用配置文件,这是我们现在常用的,也就是创建一个扫描类
我们需要用注解先告诉这个类是一个配置类,再用一个注解来告诉它要扫描那个包
@Configuration 声明是配置类
@ComponentScan 扫描具体包结构的
使用如下:
@Configuration
@ComponentScan("com.qcby.service")
public class SpringConfig {
}
配置文件删掉也没关系了。
但是我们创建工厂时需要使用下面方法来创建:
//创建spring工厂,加载配置类 ApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfig.class);
测试如下: