System.out.println("这是Bean1!");
}
}
### 2.3 创建工厂
>
> 创建一个工厂,构造方法显示当前实例正在生成,以及创建一个生成类的方法
>
>
>
package com.itheima;
public class MyBeanFactory {
public MyBeanFactory()
{
System.out.println(“bean工厂实例化中!”);
}
public Bean1 createBean()
{
return new Bean1();
}
}
### 2.4 配置applicationContext
>
> 注意此处将工厂类注册为一个Bean,填写其class后,将再次把工厂类作为一个Bean,使用factory-bean来标明工厂类,且已factory-method标明工厂方法。
>
>
>
<?xml version="1.0" encoding="UTF-8"?>
2.5 工厂实例的测试类
使用ApplicationContext作为Spring的容器,将注册的Bean注入,再通过获取Bean来实例化工厂类,以及自动实现工厂方法。
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String args[])
{
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationBean1.xml");
System.out.println(applicationContext.getBean("bean1"));
}
}
2.6 测试结果
三、Bean的作用域
作用域 | 描述 |
singleton | 即单例模式,实际只创建一个实例 |
prototype | 即原型模式,每次请求都产生一个新的实例 |
request | 作用于Web,每一个HTTP请求都会有实例 |
session | 作用于Web,每一个HTTPSessioon请求都会有一个实例 |
global session | 作用于Web,限定为HTTPSession的生命周期 |
四、装配方式
4.1 基于XML的setter的注入
即上文中提到的setXX()以及getXX()的方法来进行赋值的方法,较为容易理解。
4.2 基于XML的构造方法的注入
即通过构造方法来对类中的成员变量进行直接的赋值的方法。
4.3 基于注解的装配
当一个项目的Bean过多时,通过XML的装配方式,会使得applicationContext文件中内容较为臃肿,那么此时就可以用到注解来解决相关问题。
以下是常用注解:
注解 | 描述 |
@Component | 即一个普通Bean,作用于任何层次 |
@Controller | 即控制组件Bean,用于控制层 |
@Service | 即业务逻辑Bean,用于业务层 |
@Repository | 即数据访问Bean,用于数据访问层 |
@Scope | 即Bean实例的作用域 |
@Value | 即Bean实例的注入值 |
@Autowired | 指自动装配对象 |
@Resource | 指要注入的对象 |
@PostConstruct | 指实例初始化完成之后调用的方法 |
@Qualifier | 自动装配的对象名称,通常与@Autowired联用 |
@PreDestory | 指实例销毁前调用的方法 |
五、注解实例
结构图:
5.1 编写基本类
package com.itheima.entity;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
@Component("user")
@Scope("singleton")
public class User {
@Value("1")
private int id;
@Value("Zhuang San")
private String name;
@Value("1234")
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void setPassword(String password) {
this.password = password;
}
public String getPassword() {
return password;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", password='" + password + '\'' +
'}';
}
}
5.2 编写Dao层接口
package com.itheima.Dao;
public interface UserDao {
public void save();
}
5.3 编写Dao层实现类
package com.itheima.Dao;
import com.itheima.entity.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Repository;
@Repository("userDao")
public class UserDaoImpl implements UserDao {
public void save(){
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext2.xml");
User user=(User) applicationContext.getBean("user");
System.out.println(user);
System.out.println("Executing UserDaoImpl.save() ");
}
}
5.4 编写ServiceDao层
package com.itheima.Service;
public interface UserService {
public void save();
}
5.5 编写Service实现类
package com.itheima.Service;
import javax.annotation.Resource;
import com.itheima.Dao.UserDao;
import org.springframework.stereotype.Service;
@Service("userService")
public class UserServiceImpl implements UserService{
@Resource(name="userDao")
private UserDao userDao;
public void save(){
this.userDao.save();
System.out.println("Executing UserServiceImpl.save()");
}
}
5.6 编写Controller类
package com.itheima.Controller;
import com.itheima.Service.UserService;
import org.springframework.stereotype.Controller;
import javax.annotation.Resource;
@Controller
public class UserController {
@Resource(name="userService")
private UserService userService;
public void save(){
this.userService.save();
System.out.println("Executing UserController.save() ");
}
}
5.7 编写测试类
import com.itheima.Controller.UserController;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
**Java面试核心知识点笔记**
其中囊括了JVM、锁、并发、Java反射、Spring原理、微服务、Zookeeper、数据库、数据结构等大量知识点。
![蚂蚁金服(Java研发岗),26岁小伙斩获三面,收获Offer定级P6](https://img-blog.csdnimg.cn/img_convert/60bf41be9467977cc368eca12089df3b.webp?x-oss-process=image/format,png)
**Java中高级面试高频考点整理**
![蚂蚁金服(Java研发岗),26岁小伙斩获三面,收获Offer定级P6](https://img-blog.csdnimg.cn/img_convert/ebb706b8c431d62653435068cf30ecfd.webp?x-oss-process=image/format,png)
![蚂蚁金服(Java研发岗),26岁小伙斩获三面,收获Offer定级P6](https://img-blog.csdnimg.cn/img_convert/b6c1c8ac1e561be29f5ef533a6d7386a.webp?x-oss-process=image/format,png)
**最后分享Java进阶学习及面试必备的视频教学**
![蚂蚁金服(Java研发岗),26岁小伙斩获三面,收获Offer定级P6](https://img-blog.csdnimg.cn/img_convert/610623aa27e05c4c41021e95f223e040.webp?x-oss-process=image/format,png)
xt.support.ClassPathXmlApplicationContext;
**Java面试核心知识点笔记**
其中囊括了JVM、锁、并发、Java反射、Spring原理、微服务、Zookeeper、数据库、数据结构等大量知识点。
[外链图片转存中...(img-Yepf3ajR-1714471702434)]
**Java中高级面试高频考点整理**
[外链图片转存中...(img-uI8zyUgP-1714471702435)]
[外链图片转存中...(img-K6Zq193Y-1714471702435)]
**最后分享Java进阶学习及面试必备的视频教学**
[外链图片转存中...(img-qTPjMZeM-1714471702435)]
> **本文已被[CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】](https://bbs.csdn.net/topics/618154847)收录**