欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

Spring学习笔记

最编程 2024-02-22 12:40:56
...

学习来源博客
https://blog.****.net/weixin_44207403/article/details/106736102?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522169449699416800192275708%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=169449699416800192275708&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-1-106736102-null-null.142v93chatsearchT3_1&utm_term=spring&spm=1018.2226.3001.4187

  1. beans.xml
    这里的name并不是属性 , 而是set方法后面的那部分 , 首字母小写
 <bean id="user" class="com.kuang.pojo.User">
       <property name="name" value="kuangshen"/>
   </bean>
public void setName(String name) {
       this.name = name;
  }
  1. 有参构造方法的beans.xml
<!-- 第一种根据index参数下标设置 -->
<bean id="userT" class="com.kuang.pojo.UserT">
   <!-- index指构造方法 , 下标从0开始 -->
   <constructor-arg index="0" value="kuangshen2"/>
</bean>
<!-- 第二种根据参数名字设置 -->
<bean id="userT" class="com.kuang.pojo.UserT">
   <!-- name指参数名 -->
   <constructor-arg name="name" value="kuangshen2"/>
</bean>
<!-- 第三种根据参数类型设置 -->
<bean id="userT" class="com.kuang.pojo.UserT">
   <constructor-arg type="java.lang.String" value="kuangshen2"/>
</bean>

参数名的name

   public UserT(String name) {
       this.name = name;
  }
  1. 要求被注入的属性 , 必须有set方法 , set方法的方法名由set + 属性首字母大写 , 如果属性是boolean类型 , 没有set方法 , 是 is .
  2. 注入的不同写法
常量注入和bean注入
<bean id="student" class="com.kuang.pojo.Student">
     <property name="name" value="小明"/>
     <property name="address" ref="addr"/>
 </bean>
其他的还有array、list、map等注入的书写方式都不同
大概是这样的
 <property name="card">
     <map>
         <entry key="中国邮政" value="456456456465456"/>
         <entry key="建设" value="1456682255511"/>
     </map>
 </property>

 <property name="hobbys">
     <list>
         <value>听歌</value>
         <value>看电影</value>
         <value>爬山</value>
     </list>
 </property>

当一个bean节点带有 autowire byName的属性时。

将查找其类中所有的set方法名,例如setCat,获得将set去掉并且首字母小写的字符串,即cat。

去spring容器中寻找是否有此字符串名称id的对象。

如果有,就取出注入;如果没有,就报空指针异常。

使用autowire byType (按类型自动装配)

使用autowire byType首先需要保证:

同一类型的对象,在spring容器中唯一。如果不唯一,会报不唯一的异常。

加上autowire="byName"或者“byName”的作用,就可以在外面写bean,不用ref关联上了

<bean id="cat" class="com.spring.pojo.Cat"/>
    <bean id="dog" class="com.spring.pojo.Dog"/>
 
    <bean id="user" class="com.spring.pojo.User" autowire="byName">
<!--        注释掉-->
<!--        <property name="cat" ref="cat"/>-->
<!--        <property name="dog" ref="dog"/>-->
        <property name="username" value="jiang"/>
    </bean>

几个注解进行自动装配
@Autowired
@Autowired是按类型自动转配的,不支持id匹配。

@Qualifier
@Autowired是根据类型自动装配的,加上@Qualifier则可以根据byName的方式自动装配

<bean id="cat" class="com.spring.pojo.Cat"/>
    <bean id="cat02" class="com.spring.pojo.Cat"/>
    <bean id="dog" class="com.spring.pojo.Dog"/>
    <bean id="dog02" class="com.spring.pojo.Dog"/>
    <bean id="user" class="com.spring.pojo.User">
        <property name="username" value="jiang"/>
    </bean>
@Autowired
@Qualifier(value = "cat02")
private Cat cat;
@Autowired
@Qualifier(value = "dog02")
private Dog dog;

@Resource
@Resource(属于J2EE规范),默认按照名称进行装配,名称可以通过name属性进行指定。如果没有指定name属性,当注解写在字段上时,默认取字段名进行按照名称查找,如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配

public class User {
   //如果允许对象为null,设置required = false,默认为true
   @Resource(name = "cat2")
   private Cat cat;
   @Resource
   private Dog dog;
   private String str;
}

使用@Resource、@Autowired注解bean里也可以不用ref关联,而且类里不用再写set方法

注解进行属性注入
@Component三个衍生注解
为了更好的进行分层,Spring可以使用其它三个注解,功能一样,目前使用哪一个功能都一样。

@Controller:controller层
@Service:service层
@Repository:dao层
@Component("user")
// 相当于配置文件中 <bean id="user" class="当前注解的类"/>
public class User {
   @Value("秦疆")
   // 相当于配置文件中 <property name="name" value="秦疆"/>
   public String name;
}

用了这些注解就不用配置bean也不用set方法了