Spring_bean注解(xml解析)

简介: Spring_bean注解(xml解析)

IOC容器

控制反转(Inversion of Control),是面向对象编程中的一种设计原则,可以降低耦合度。包括依赖注入(Dependency Injection)、依赖查找(Dependency Lookup)。创建对象时,系统将其所依赖的对象的引用传递给自身。

原生的实现接口

java中实现一个接口功能,创建一个类来实现接口,我创建一个接口Dosomething,在创建一个Working类来实现这个接口。

public interface Dosomething {
    public void down();//实现某个功能
}
public class Working implements Dosomething{
    @Override
    public void down() {
        //实现接口功能
    }
}

工厂模式

创建一个第三者将接口和实现类关联起来

public class Do_cosplay{
    public void down()
    {
        System.out.println("模拟工厂模式\n");
    }
}
public class User_cosplay{//模拟用户类
public void execute(){
    Do_cosplay dosomething=Factory_cosplay.getDo_cosplay();
    dosomething.down();//实现
}
}
public class Factory_cosplay {//模拟工厂类
    public static Do_cosplay getDo_cosplay() {
        return new Do_cosplay();
    }
}

xml注解

spring提供IOC容器两种方式

  • BeanFactory
  • ApplicationContext
BeanFactory ApplicationContext
加载配置文件不创建对象,获取使用创建对象 加载配置文件时创建配置文件
ClassPathXmlApplicationContext("");//对应src下的路径(相对路径)
FileSystemXmlApplicationContext("");//对应绝对路径

这个路径可以在ide改,但是可能会报错(ClassNotFoundException

推荐放在src目录下

bean无参注入

需要对象拥有无参的构造函数

基本属性

bean

id、class

class对应packge.class类、id对应唯一的对象标识(不是创建名)。

property

name、value

name对应set方法名(去掉set)、value对应set方法注入对象属性的值。

bean的创建销毁

需要配置。

init-method创建方法。

destroy-method销毁方法。

package bean_test;
public class User {
    private  String name,age,sex;
    public void setName(String name) {
        this.name = name;
    }
    public void setAge(String age) {
        this.age = age;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public void initmethod()
    {
        System.out.print("创建user");
    }
    public void destroymethod()
    {
        System.out.print("销毁user");
    }
    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age='" + age + '\'' +
                ", sex='" + sex + '\'' +
                '}';
    }
}

配置文件(无参构造set注入)

<bean id="user01" class="bean_test.User" init-method="initmethod" destroy-method="destroymethod">
    <property name="name" value="yma16" ></property>
    <property name="sex" value="男"></property>
    <property name="age" value="18"></property>
</bean>
ApplicationContext context1= new ClassPathXmlApplicationContext("bean01.xml");
User user=context1.getBean("user01",User.class);
System.out.println(user);

无参注入成功!

bean的有参注入

需要有参的构造方法

constructor-arg标签

配置有参构造函数的参数属性

<bean id="" class="">
<constructor-arg name="" value=""></constructor-arg>
</bean>
bean的p命名空间

在bean标签中添加

xmlns:p="http://www.springframework.org/schema/p"

属性添加

p:属性=""

在User类添加一个有参构造函数

package bean_test;
public class User {
    private  String name,age,sex;
//    public User()
//    {
//        System.out.println("无参构造");
//    }
    public User(String name,String age,String sex)
    {
        this.name=name;
        this.age=age;
        this.sex=sex;
        System.out.println("有参构造");
    }
    public void setName(String name) {
        this.name = name;
    }
    public void setAge(String age) {
        this.age = age;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public void initmethod()
    {
        System.out.print("创建user");
    }
    public void destroymethod()
    {
        System.out.print("销毁user");
    }
    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age='" + age + '\'' +
                ", sex='" + sex + '\'' +
                '}';
    }
}

bean设置

<bean id="user02" class="bean_test.User" init-method="initmethod" destroy-method="destroymethod">
<constructor-arg name="name" value="yma16_替身"></constructor-arg>
<constructor-arg name="sex" value="男"></constructor-arg>
<constructor-arg name="age" value="16"></constructor-arg>
</bean>

有参注入成功!

bean注入特殊符号

字面量

private String name="yam16";//定值
null值和特殊符号< >

idea不允许直接粗暴的写<>

分别使用&lt;&gt;转义成<>

<property name="slog" value="&lt;yma16&gt;"></property>

使用CDATA

<bean id="s01" class="bean_test.Strange">
            <property name="slog">
                <value>
                    <![CDATA[<yma16>]]>
                </value>
            </property>
        </bean>

注入外部bean

创建另一个类调用User对象

ref标签

链接bean的id

测试用例

使用创建一个Outbean类调用User类

package bean_test;
public class Outbean {
    public User userclass;//外部的user
    public String Oname;
    public void setUserclass(User userclass) {
        this.userclass = userclass;
    }
    public void setOname(String oname) {
        Oname = oname;
    }
    @Override
    public String toString() {
        return "Outbean{" +
                "userclass=" + userclass +
                ", Oname='" + Oname + '\'' +
                '}';
    }
}

bean的配置

<bean id="Out01" class="bean_test.Outbean" init-method="initmethod" destroy-method="destroymethod">
        <property name="oname" value="测试1号"></property>
        <property name="userclass" ref="user_ref"></property>
    </bean>
    <bean id="user_ref" class="bean_test.User" init-method="initmethod" destroy-method="destroymethod">
        <constructor-arg name="name" value="yma16_ref"></constructor-arg>
        <constructor-arg name="sex" value="男_ref"></constructor-arg>
        <constructor-arg name="age" value="16_ref"></constructor-arg>
    </bean>

外部bean测试完成!

array、set、map、list

创建一个Array_Listcase类并且创建array、set、map、list属性。

package bean_test;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class Array_Listcase {
    public String[] array_case;
    public Map<String,String> map_case;
    public List<String> list_case;
    public Set<String> set_case;
    public void setArray_case(String[] array_case) {
        this.array_case = array_case;
    }
    public void setMap_case(Map<String, String> map_case) {
        this.map_case = map_case;
    }
    public void setList_case(List<String> list_case) {
        this.list_case = list_case;
    }
    public void setSet_case(Set<String> set_case) {
        this.set_case = set_case;
    }
    public void initmethod()
    {
        System.out.print("创建Outbean");
    }
    public void destroymethod()
    {
        System.out.print("销毁Outbean");
    }
    @Override
    public String toString() {
        return "Array_Listcase{" +
                "array_case=" + array_case +
                ", map_case=" + map_case +
                ", list_case=" + list_case +
                ", set_case=" + set_case +
                '}';
    }
}

bean配置

<bean id="case01" class="bean_test.Array_Listcase" init-method="initmethod" destroy-method="destroymethod">
        <property name="array_case">
            <array>
                <value>yma16</value>
                <value>18</value>
            </array>
        </property>
        <property name="map_case">
            <map>
                <entry key="I am a keay" value="I am a value"></entry>
                <entry key="yma16" value="yma16 value"></entry>
            </map>
        </property>
        <property name="list_case">
            <list>
                <value>yma16</value>
                <value>2020</value>
            </list>
        </property>
        <property name="set_case">
            <set>
                <value>I am a set</value>
                <value>yma16</value>
            </set>
        </property>
    </bean>

测试结果!

注解方式

Component、Service、Controller、Ropository
  • @Component
  • @Service
  • @Controller
  • @Ropository
    注解方式可以类、方法和属性名上面
@注解(value="");<!-- 对应 bean标签中 id唯一标识   -->
  1. 引入依赖aop
  2. 开启组件扫描
  3. 引入命名空间context

创建一个Demo类,component方式创建对象

package context_demo;
import org.springframework.stereotype.Component;
@Component(value="component1")
public class Demo {
}
System.out.println("component方式注入");
ApplicationContext context5= new ClassPathXmlApplicationContext("bean05.xml");
Demo compnent1=context5.getBean("component1", Demo.class);
System.out.println(compnent1);
<context:component-scan base-package="context_demo">
</context:component-scan>

component方式注入成功!

基于注解方式的属性注入

Autowired、Qualifier、Resource

注入

  • Autowired(属性类型)
  • Qualifier(属性名称)
  • Resource(属性类型或属性名称)
  • value(普通类型属性)

代码:去我的仓库

end


目录
相关文章
|
3月前
|
数据采集 人工智能 Java
1天消化完Spring全家桶文档!DevDocs:一键深度解析开发文档,自动发现子URL并建立图谱
DevDocs是一款基于智能爬虫技术的开源工具,支持1-5层深度网站结构解析,能将技术文档处理时间从数周缩短至几小时,并提供Markdown/JSON格式输出与AI工具无缝集成。
141 1
1天消化完Spring全家桶文档!DevDocs:一键深度解析开发文档,自动发现子URL并建立图谱
|
3月前
|
安全 Java API
深入解析 Spring Security 配置中的 CSRF 启用与 requestMatchers 报错问题
本文深入解析了Spring Security配置中CSRF启用与`requestMatchers`报错的常见问题。针对CSRF,指出默认已启用,无需调用`enable()`,只需移除`disable()`即可恢复。对于`requestMatchers`多路径匹配报错,分析了Spring Security 6.x中方法签名的变化,并提供了三种解决方案:分次调用、自定义匹配器及降级使用`antMatchers()`。最后提醒开发者关注版本兼容性,确保升级平稳过渡。
335 2
|
4月前
|
存储 Java 文件存储
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— logback.xml 配置文件解析
本文解析了 `logback.xml` 配置文件的详细内容,包括日志输出格式、存储路径、控制台输出及日志级别等关键配置。通过定义 `LOG_PATTERN` 和 `FILE_PATH`,设置日志格式与存储路径;利用 `&lt;appender&gt;` 节点配置控制台和文件输出,支持日志滚动策略(如文件大小限制和保存时长);最后通过 `&lt;logger&gt;` 和 `&lt;root&gt;` 定义日志级别与输出方式。此配置适用于精细化管理日志输出,满足不同场景需求。
325 1
|
3月前
|
前端开发 安全 Java
Spring Boot 便利店销售系统项目分包设计解析
本文深入解析了基于Spring Boot的便利店销售系统分包设计,通过清晰的分层架构(表现层、业务逻辑层、数据访问层等)和模块化设计,提升了代码的可维护性、复用性和扩展性。具体分包结构包括`controller`、`service`、`repository`、`entity`、`dto`、`config`和`util`等模块,职责分明,便于团队协作与功能迭代。该设计为复杂企业级应用开发提供了实践参考。
136 0
|
2月前
|
安全 Java API
Spring Boot 功能模块全解析:构建现代Java应用的技术图谱
Spring Boot不是一个单一的工具,而是一个由众多功能模块组成的生态系统。这些模块可以根据应用需求灵活组合,构建从简单的REST API到复杂的微服务系统,再到现代的AI驱动应用。
307 8
|
3月前
|
Java 关系型数据库 MySQL
深入解析 @Transactional——Spring 事务管理的核心
本文深入解析了 Spring Boot 中 `@Transactional` 的工作机制、常见陷阱及最佳实践。作为事务管理的核心注解,`@Transactional` 确保数据库操作的原子性,避免数据不一致问题。文章通过示例讲解了其基本用法、默认回滚规则(仅未捕获的运行时异常触发回滚)、因 `try-catch` 或方法访问修饰符不当导致失效的情况,以及数据库引擎对事务的支持要求。最后总结了使用 `@Transactional` 的五大最佳实践,帮助开发者规避常见问题,提升项目稳定性与可靠性。
363 12
|
3月前
|
缓存 安全 Java
深入解析HTTP请求方法:Spring Boot实战与最佳实践
这篇博客结合了HTTP规范、Spring Boot实现和实际工程经验,通过代码示例、对比表格和架构图等方式,系统性地讲解了不同HTTP方法的应用场景和最佳实践。
256 5
|
3月前
|
安全 Java 数据安全/隐私保护
Spring Security: 深入解析 AuthenticationSuccessHandler
本文深入解析了 Spring Security 中的 `AuthenticationSuccessHandler` 接口,它用于处理用户认证成功后的逻辑。通过实现该接口,开发者可自定义页面跳转、日志记录等功能。文章详细讲解了接口方法参数及使用场景,并提供了一个根据用户角色动态跳转页面的示例。结合 Spring Security 配置,展示了如何注册自定义的成功处理器,帮助开发者灵活应对认证后的多样化需求。
103 2
|
3月前
|
前端开发 IDE Java
Spring MVC 中因导入错误的 Model 类报错问题解析
在 Spring MVC 或 Spring Boot 开发中,若导入错误的 `Model` 类(如 `ch.qos.logback.core.model.Model`),会导致无法解析 `addAttribute` 方法的错误。正确类应为 `org.springframework.ui.Model`。此问题通常因 IDE 自动导入错误类引起。解决方法包括:删除错误导入、添加正确包路径、验证依赖及清理缓存。确保代码中正确使用 Spring 提供的 `Model` 接口以实现前后端数据传递。
114 0
|
2月前
|
Android开发 开发者
Android自定义View之不得不知道的文件attrs.xml(自定义属性)
本文详细介绍了如何通过自定义 `attrs.xml` 文件实现 Android 自定义 View 的属性配置。以一个包含 TextView 和 ImageView 的 DemoView 为例,讲解了如何使用自定义属性动态改变文字内容和控制图片显示隐藏。同时,通过设置布尔值和点击事件,实现了图片状态的切换功能。代码中展示了如何在构造函数中解析自定义属性,并通过方法 `setSetting0n` 和 `setbackeguang` 实现功能逻辑的优化与封装。此示例帮助开发者更好地理解自定义 View 的开发流程与 attrs.xml 的实际应用。
Android自定义View之不得不知道的文件attrs.xml(自定义属性)

热门文章

最新文章

推荐镜像

更多
  • DNS