what’s is bean in Java?
说到bean,我们应该都不陌生, 它是计算机自动生产得类,由一个 IOC容器实例化,组织管理得对象。通俗来讲,它是程序运行时, 由spring反射生产得。那么,如果我们不在程序中使用代码去new一个类,那谁来做这个事捏?
我们先来看看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">
<bean id="userService" class="com.service.UserService">
<property name="userDao" ref="userDaoImpl"></property>
</bean>
<bean id="userDaoImpl" class="com.dao.UserImpl"></bean>
</beans>
在上述样例中,我定义了一个bean,标识是userService, 然后在userService中,注入了bean,代码如下
package com.service;
import com.dao.UserDao;
import com.dao.UserImpl;
public class UserService {
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void add() {
System.out.println("Service add ...");
// UserDao userDao = new UserImpl();
userDao.update();
}
}
现在我们发现上面代码并没有写new UserDao类似的字眼,而是加了个构造函数(一般是要写的),接受这个UserDao, 而在xml配置中已经把这个UserDao类传进来 了
方式二:完全注解配置
package com.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration //作为配置类, 替代xml文件
@ComponentScan(basePackages = {"com"})
//等价于<context:component-scan base-package="com"></context:component-scan>
public class SpringConfig {
//和springboot里面的启动类类似的功能
}
package com.struct;
import com.dao.CourseDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service
public class CourseService {
@Value(value = "a")
private String name;
@Autowired
@Qualifier(value = "courseDaoImpl1")
// @Resource(name = "courseDaoImpl1")
private CourseDao courseDao;
public void add() {
System.out.println("add..." + name);
courseDao.add();
}
}
此时的@Autowired语句,其实就等价于xml中的
<context:component-scan base-package="com"></context:component-scan>
@Service就相当于标签。是不是有点springboot的味道了?对,springboot可以说是在spring上进行扩展。这样理解,就能明白之前为什么可以直接加个注解就能代表注入属性和方法,创建对象实例等等,顿时感到开阔了视野hh
说完上面的,来谈谈bean, 到底什么是bean?
Bean的中文含义是“豆子”。JavaBean实际上是指一种特殊的Java类,它通常用来实现一些比较常用的简单功能,并可以很容易的被重用或者是插入其他应用程序中去。所有遵循一定编程原则的Java类都可以被称作JavaBean。
Java Bean是基于Java的组件模型,由属性、方法和事件3部分组成。在该模型中,JavaBean可以被修改或与其他组件结合以生成新组件或完整的程序。它是一种Java类,通过封装成为具有某种功能或者处理某个业务的对象。因此,也可以通过嵌在JSP页面内的Java代码访问Bean及其属性。
Bean的含义是可重复使用的Java组件。所谓组件就是一个由可以自行进行内部管理的一个或几个类所组成、外界不了解其内部信息和运行方式的群体。使用它的对象只能通过接口来操作。
JavaBean编写规范
Java Bean实际上是根据JavaBean技术标准所指定Bean的命名和设计规范编写的Java类。这些类遵循一个接口格式,以便于使函数命名、底层行为以及继承或实现的行为,其最大的优点在于可以实现代码的可重用性。Bean并不需要继承特别的基类(BaseClass)或实现特定的接口(Interface)。Bean的编写规范使Bean的容器(Container)能够分析一个Java类文件,并将其方法(Methods)翻译成属性(Properties),即把Java类作为一个Bean类使用。Bean的编写规范包括Bean类的构造方法、定义属性和访问方法编写规则。
说白了,bean就类似是定义的一个组件,而这个组件的作用就是实现某个功能的。在spring里给定义的bean就是说,我给你了一个更为简便的方法来调用这个组件去实现你要完成的功能
<!-- 利用set注入Dog -->
<bean id="d1" class="com.yang.Dog">
<property name="name" value="lala"></property>
<property name="age" value="9"></property>
<property name="style" value="Hashiqi"></property>
</bean>
@Autowired
@Qualifier(value = "courseDaoImpl1")
// @Resource(name = "courseDaoImpl1")
private UserDao userDao;
//等价于:
<bean id="userService" class="com.service.UserService">
<property name="userDao" ref="userDaoImpl"></property>
</bean>
<bean id="userDaoImpl" class="com.dao.UserImpl"></bean>
//等价于:
class AddFactory:IFactory{
public userDao CreateOperation(){
return new userDao();
}
}
一个bean对应一个类,处于一一对应的关系
二:通过Java代码装配bean
尽管在很多场景下通过组件扫描和自动装配实现Spring的自动化更为推荐,但是有时候行不通。比如引用第三方组件,没办法在它的类上添加@Component及@Autowired。所以就需要JavaConfig或者XML配置
在进行显示配置的时候,JavaConfig是更好的解决方案。
JavaConfig与其他的Java代码又有所区别,在概念上它与应用程序中的业务逻辑和领域代码又有所不同。JavaConfig是配置相关代码,不含任何逻辑代码。通常会将JavaConfig放到单独的包中。
创建JavaConfig类
@Configuration //配置类
public class CDPlayerConfig {
}
声明简单的bean
@Bean
public IMediaPlayer cdplayer() {
return new VCDPlayer(new JayCompactDisc());
}
@Bean注解会告诉Spring将返回一个对象。
默认情况下,@Bean的Id与带有@Bean的方法名基本一样。当然也可以通过@Bean的name属性指定额外的方法名。
总结
bean是一个Java对象,根据bean规范编写出来的类,并由bean容器生成的对象就是一个bean。
创建应用对象之间的协作关系的行为称为:装配(wiring),这就是依赖注入的本质。
如果所有的对象都是独立的,彼此之间没有任何依赖,那么使用组件扫描就能自动化装配bean。
但是实际工作中,很多对象会依赖其他对象完成任务。这时候就需要能够将组件扫描得到的bean和他们依赖装配在一起。这就是自动装配(autowiring)
感觉说的还不是很清楚,呜呜呜~😭😭
回过头来看的时候,不知道会不会打死我自己hh,反正目前我是理解了的😭