<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Aditya Karad</title>
    <description>The latest articles on Forem by Aditya Karad (@itskarad).</description>
    <link>https://forem.com/itskarad</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1012123%2Fe50f159a-1685-4f92-be28-f4a3c77c83a0.jpeg</url>
      <title>Forem: Aditya Karad</title>
      <link>https://forem.com/itskarad</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/itskarad"/>
    <language>en</language>
    <item>
      <title>Six ways of dependency injection in Spring Boot — A Deep Dive</title>
      <dc:creator>Aditya Karad</dc:creator>
      <pubDate>Sun, 12 Feb 2023 04:21:56 +0000</pubDate>
      <link>https://forem.com/itskarad/six-ways-of-dependency-injection-in-spring-boot-a-deep-dive-54j3</link>
      <guid>https://forem.com/itskarad/six-ways-of-dependency-injection-in-spring-boot-a-deep-dive-54j3</guid>
      <description>&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;Dependency injection in Spring can be done through&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Constructor injection&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Setters injection&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Field injection&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now, each approach can be executed in two ways — you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;use Java annotations like &lt;code&gt;@Autowired&lt;/code&gt; and let Spring scan for components in your codebase&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;define each bean in your spring config XML file.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Pre-requisites
&lt;/h1&gt;

&lt;p&gt;Since the idea of this post is to learn about different methods of injections, our project setup is simple.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://Laptop.java" rel="noopener noreferrer"&gt;&lt;code&gt;Laptop.java&lt;/code&gt;&lt;/a&gt; class represents a Laptop. Now a Laptop has different attributes like &lt;code&gt;Display&lt;/code&gt;, &lt;code&gt;HardDisk&lt;/code&gt;, &lt;code&gt;Battery&lt;/code&gt;. For now, let’s only consider &lt;a href="http://HardDisk.java" rel="noopener noreferrer"&gt;&lt;code&gt;HardDisk.java&lt;/code&gt;&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Laptop&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;HardDisk&lt;/span&gt; &lt;span class="n"&gt;hardDisk&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Laptop&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;HardDisk&lt;/span&gt; &lt;span class="n"&gt;hardDisk&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hardDisk&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hardDisk&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;saveData&lt;/span&gt;&lt;span class="o"&gt;(){&lt;/span&gt;
        &lt;span class="n"&gt;hardDisk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;saveData&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="http://HardDisk.java" rel="noopener noreferrer"&gt;&lt;code&gt;HardDisk.java&lt;/code&gt;&lt;/a&gt; is an interface which is implemented by two &lt;code&gt;HardDisk&lt;/code&gt; implementations: &lt;code&gt;SanDiskHD&lt;/code&gt; and &lt;code&gt;HitachiHD&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;HardDisk&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;saveData&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;HitachiHD&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;HardDisk&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;saveData&lt;/span&gt;&lt;span class="o"&gt;(){&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"HitachiHD: saveData"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SanDiskHD&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;HardDisk&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;saveData&lt;/span&gt;&lt;span class="o"&gt;(){&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"SanDiskHD: saveData"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The point of having dependency injection is to follow the loose coupling principle in our code design.&lt;/p&gt;

&lt;p&gt;Now we will go over the ways in which different implementations of &lt;code&gt;HardDisk&lt;/code&gt; (i.e. &lt;code&gt;SanDiskHD&lt;/code&gt; and &lt;code&gt;HitachiHD&lt;/code&gt;) can be injected into &lt;code&gt;Laptop&lt;/code&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Injection using Annotations
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;In my experience, this approach is widely used for large projects. This is also the one I use the most.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Spring will scan your Java code for annotations and automatically register beans in the spring container.&lt;/p&gt;

&lt;p&gt;For enabling injection through annotations, you should:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Enable component scanning in your project in your spring config file.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;beans&lt;/span&gt; &lt;span class="na"&gt;xmlns=&lt;/span&gt;&lt;span class="s"&gt;"&amp;lt;http://www.springframework.org/schema/beans&amp;gt;"&lt;/span&gt;
       &lt;span class="na"&gt;xmlns:xsi=&lt;/span&gt;&lt;span class="s"&gt;"&amp;lt;http://www.w3.org/2001/XMLSchema-instance&amp;gt;"&lt;/span&gt;
       &lt;span class="na"&gt;xmlns:context=&lt;/span&gt;&lt;span class="s"&gt;"&amp;lt;http://www.springframework.org/schema/context&amp;gt;"&lt;/span&gt;
       &lt;span class="na"&gt;xsi:schemaLocation=&lt;/span&gt;&lt;span class="s"&gt;"&amp;lt;http://www.springframework.org/schema/beans&amp;gt;
    &amp;lt;http://www.springframework.org/schema/beans/spring-beans.xsd&amp;gt;
    &amp;lt;http://www.springframework.org/schema/context&amp;gt;
    &amp;lt;http://www.springframework.org/schema/context/spring-context.xsd&amp;gt;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!--    Enable component scan--&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;context:component-scan&lt;/span&gt; &lt;span class="na"&gt;base-package=&lt;/span&gt;&lt;span class="s"&gt;"com.learningspring.demo.src"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/beans&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mark classes with &lt;code&gt;@Component&lt;/code&gt; annotation. Optionally, you can also provide a bean id.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;@Component("hardDisk")
public class HitachiHD implements HardDisk {
    public void saveData(){
        System.out.println("HitachiHD: saveData");
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fetch the bean using bean id.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;ApplicationContext&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ClassPathXmlApplicationContext&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"applicationContext.xml"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="nc"&gt;HardDisk&lt;/span&gt; &lt;span class="n"&gt;hd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getBean&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"hardDisk"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;HardDisk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;hd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;saveData&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="nc"&gt;SpringApplication&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;DemoApplication&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run, and see the results.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;20:13:24.494 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'hardDisk'
HitachiHD: saveData
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 Now, spring also assigns a default bean id for a bean if you don’t give one. The pattern is a camel-case version of the class name.&lt;/p&gt;

&lt;p&gt;So a bean of type &lt;code&gt;HitachiHD&lt;/code&gt; would have a bean id of &lt;code&gt;hitachiHD&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Injection using Annotations and Autowiring
&lt;/h1&gt;

&lt;h2&gt;
  
  
  What is Autowiring?
&lt;/h2&gt;

&lt;p&gt;Spring can automatically find beans by matching the type (class or interface) and inject it automatically.&lt;/p&gt;

&lt;p&gt;So, if you want to inject a &lt;code&gt;HardDisk&lt;/code&gt; implementation into &lt;code&gt;Laptop&lt;/code&gt;, you can annotate the &lt;code&gt;HardDisk&lt;/code&gt; attribute of &lt;code&gt;Laptop&lt;/code&gt; class with &lt;code&gt;@Autowired&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This will tell spring to scan all the components in your code, find a bean which matches the class of type &lt;code&gt;HardDisk&lt;/code&gt;, and inject it into the &lt;code&gt;Laptop&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;For eg: If you annotate &lt;code&gt;HitachiHD&lt;/code&gt; with &lt;code&gt;@Component&lt;/code&gt;, it will inject &lt;code&gt;HitachiHD&lt;/code&gt; into &lt;code&gt;Laptop&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Now, there are three ways of autowiring beans:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Field injection&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Constructor injection&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Setter injection&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Field Injection
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Annotate the implementation of &lt;code&gt;HardDisk&lt;/code&gt; you want to inject into &lt;code&gt;Laptop&lt;/code&gt; with &lt;code&gt;@Component&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Component&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;HitachiHD&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;HardDisk&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;saveData&lt;/span&gt;&lt;span class="o"&gt;(){&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"HitachiHD: saveData"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Inject the &lt;code&gt;HardDisk&lt;/code&gt; bean into &lt;code&gt;Laptop&lt;/code&gt; by annotating the &lt;code&gt;HardDisk&lt;/code&gt; attribute with &lt;code&gt;@Autowired&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Component&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Laptop&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;@Autowired&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;HardDisk&lt;/span&gt; &lt;span class="n"&gt;hardDisk&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;saveData&lt;/span&gt;&lt;span class="o"&gt;(){&lt;/span&gt;
        &lt;span class="n"&gt;hardDisk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;saveData&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;To test this autowiring, let’s get the &lt;code&gt;Laptop&lt;/code&gt; bean and invoke it’s &lt;code&gt;saveData()&lt;/code&gt; to see the results&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;ApplicationContext&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ClassPathXmlApplicationContext&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"applicationContext.xml"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="nc"&gt;Laptop&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getBean&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"laptop"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Laptop&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;saveData&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="nc"&gt;SpringApplication&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;DemoApplication&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;21:23:50.350 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'hitachiHD'
21:23:50.351 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'laptop'
HitachiHD: saveData
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Drawbacks:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Costlier than constructor-based or setter-based injection.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Incentivises to have many dependencies injected into a class, which cause design issues.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Constructor Injection
&lt;/h2&gt;

&lt;p&gt;There are two patterns:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Annotating entire constructor with &lt;code&gt;@Autowired&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Component&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Laptop&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;HardDisk&lt;/span&gt; &lt;span class="n"&gt;hardDisk&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nd"&gt;@Autowired&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Laptop&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;HardDisk&lt;/span&gt; &lt;span class="n"&gt;hardDisk&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hardDisk&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hardDisk&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;saveData&lt;/span&gt;&lt;span class="o"&gt;(){&lt;/span&gt;
        &lt;span class="n"&gt;hardDisk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;saveData&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Annotating only the specific attribute with with &lt;code&gt;@Autowired&lt;/code&gt; in the constructor.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Component&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Laptop&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;HardDisk&lt;/span&gt; &lt;span class="n"&gt;hardDisk&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Laptop&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nd"&gt;@Autowired&lt;/span&gt; &lt;span class="nc"&gt;HardDisk&lt;/span&gt; &lt;span class="n"&gt;hardDisk&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hardDisk&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hardDisk&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;saveData&lt;/span&gt;&lt;span class="o"&gt;(){&lt;/span&gt;
        &lt;span class="n"&gt;hardDisk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;saveData&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Setter Injection
&lt;/h2&gt;

&lt;p&gt;Here you annotate the setter method of the relevant attribute with &lt;code&gt;@Autowired&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Component&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Laptop&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;HardDisk&lt;/span&gt; &lt;span class="n"&gt;hardDisk&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nd"&gt;@Autowired&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setHardDisk&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;HardDisk&lt;/span&gt; &lt;span class="n"&gt;hardDisk&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hardDisk&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hardDisk&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;saveData&lt;/span&gt;&lt;span class="o"&gt;(){&lt;/span&gt;
        &lt;span class="n"&gt;hardDisk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;saveData&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What kind of dependency injection should you use?
&lt;/h2&gt;

&lt;p&gt;A good answer might be — to follow the pattern already followed in the codebase you’re working on.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What if there are multiple implementations annotated with&lt;/strong&gt; &lt;code&gt;@Component&lt;/code&gt;?
&lt;/h2&gt;

&lt;p&gt;Because autowiring by type may lead to multiple candidates, it is often necessary to have more control over the selection process. One way to accomplish this is with Spring’s  &lt;code&gt;@Primary&lt;/code&gt; annotation.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;@Primary&lt;/code&gt; indicates that a particular bean should be given preference when multiple beans are candidates to be autowired to a single-valued dependency. If exactly one primary bean exists among the candidates, it becomes the autowired value.&lt;/p&gt;

&lt;p&gt;If you want to always autowire &lt;code&gt;HitachiHD&lt;/code&gt; implementation as a &lt;code&gt;HardDisk&lt;/code&gt;, you can annotate it with &lt;code&gt;@Primary&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Primary&lt;/span&gt;
&lt;span class="nd"&gt;@Component&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;HitachiHD&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;HardDisk&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;saveData&lt;/span&gt;&lt;span class="o"&gt;(){&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"HitachiHD: saveData"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Dependency Injection with XML configuration
&lt;/h1&gt;

&lt;p&gt;Another way to configure Spring runtime with constructor-based dependency injection is to use an XML configuration file.&lt;/p&gt;

&lt;p&gt;In this case, we need to bootstrap our Spring application context using &lt;code&gt;ClassPathXmlApplicationContext&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This approach is not used commonly, and you’ll see it rarely in professional codebases. This is because for large projects, defining each bean in XML configuration file is not practical.&lt;/p&gt;

&lt;h2&gt;
  
  
  Constructor Injection
&lt;/h2&gt;

&lt;p&gt;For injecting a bean into a class,&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;First, you need to accept the &lt;code&gt;HardDisk&lt;/code&gt; bean in the constructor definition:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Laptop&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;HardDisk&lt;/span&gt; &lt;span class="n"&gt;hardDisk&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Laptop&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;HardDisk&lt;/span&gt; &lt;span class="n"&gt;hardDisk&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hardDisk&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hardDisk&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;saveData&lt;/span&gt;&lt;span class="o"&gt;(){&lt;/span&gt;
        &lt;span class="n"&gt;hardDisk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;saveData&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You have to define the beans you want to inject into &lt;code&gt;Laptop&lt;/code&gt; object using &lt;code&gt;constructor-arg&lt;/code&gt; in &lt;code&gt;applicationContext.xml&lt;/code&gt; file. &lt;code&gt;applicationContext.xml&lt;/code&gt; is a spring config file from which we can the set different properties for our Spring container.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;beans&lt;/span&gt; &lt;span class="na"&gt;xmlns=&lt;/span&gt;&lt;span class="s"&gt;"&amp;lt;http://www.springframework.org/schema/beans&amp;gt;"&lt;/span&gt;
       &lt;span class="na"&gt;xmlns:xsi=&lt;/span&gt;&lt;span class="s"&gt;"&amp;lt;http://www.w3.org/2001/XMLSchema-instance&amp;gt;"&lt;/span&gt;
       &lt;span class="na"&gt;xmlns:context=&lt;/span&gt;&lt;span class="s"&gt;"&amp;lt;http://www.springframework.org/schema/context&amp;gt;"&lt;/span&gt;
       &lt;span class="na"&gt;xsi:schemaLocation=&lt;/span&gt;&lt;span class="s"&gt;"&amp;lt;http://www.springframework.org/schema/beans&amp;gt;
    &amp;lt;http://www.springframework.org/schema/beans/spring-beans.xsd&amp;gt;
    &amp;lt;http://www.springframework.org/schema/context&amp;gt;
    &amp;lt;http://www.springframework.org/schema/context/spring-context.xsd&amp;gt;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;context:annotation-config/&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!--Defining beans here--&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;bean&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"hardDisk"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"com.learningspring.demo.src.harddisk.HitachiHD"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;bean&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"laptop"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"com.learningspring.demo.src.laptop.Laptop"&lt;/span&gt; &lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;constructor-arg&lt;/span&gt; &lt;span class="na"&gt;ref=&lt;/span&gt;&lt;span class="s"&gt;"hardDisk"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/bean&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/beans&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Let’s test this thing out by fetching the Laptop bean and invoking it’s &lt;code&gt;saveData()&lt;/code&gt; method.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;ApplicationContext&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ClassPathXmlApplicationContext&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"applicationContext.xml"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="nc"&gt;Laptop&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getBean&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"laptop"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Laptop&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;saveData&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="nc"&gt;SpringApplication&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;DemoApplication&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;00:22:04.154 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'hardDisk'
00:22:04.158 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'laptop'
HitachiHD: saveData
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So basically, we injected &lt;code&gt;HitachiHD&lt;/code&gt; bean into our laptop object through its constructor.&lt;/p&gt;

&lt;p&gt;This is called constructor injection.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setters Injection
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Create a setter method in &lt;code&gt;Laptop&lt;/code&gt; class for injections.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Laptop&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;HardDisk&lt;/span&gt; &lt;span class="n"&gt;hardDisk&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setHardDisk&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;HardDisk&lt;/span&gt; &lt;span class="n"&gt;hardDisk&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hardDisk&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hardDisk&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;saveData&lt;/span&gt;&lt;span class="o"&gt;(){&lt;/span&gt;
        &lt;span class="n"&gt;hardDisk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;saveData&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Configure dependency injection in &lt;code&gt;applicationContext.xml&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;beans&lt;/span&gt; &lt;span class="na"&gt;xmlns=&lt;/span&gt;&lt;span class="s"&gt;"&amp;lt;http://www.springframework.org/schema/beans&amp;gt;"&lt;/span&gt;
       &lt;span class="na"&gt;xmlns:xsi=&lt;/span&gt;&lt;span class="s"&gt;"&amp;lt;http://www.w3.org/2001/XMLSchema-instance&amp;gt;"&lt;/span&gt;
       &lt;span class="na"&gt;xmlns:context=&lt;/span&gt;&lt;span class="s"&gt;"&amp;lt;http://www.springframework.org/schema/context&amp;gt;"&lt;/span&gt;
       &lt;span class="na"&gt;xsi:schemaLocation=&lt;/span&gt;&lt;span class="s"&gt;"&amp;lt;http://www.springframework.org/schema/beans&amp;gt;
    &amp;lt;http://www.springframework.org/schema/beans/spring-beans.xsd&amp;gt;
    &amp;lt;http://www.springframework.org/schema/context&amp;gt;
    &amp;lt;http://www.springframework.org/schema/context/spring-context.xsd&amp;gt;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;context:annotation-config/&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!--Defining beans here--&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;bean&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"hd"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"com.learningspring.demo.src.harddisk.HitachiHD"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;bean&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"laptop"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"com.learningspring.demo.src.laptop.Laptop"&lt;/span&gt; &lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;property&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"hardDisk"&lt;/span&gt; &lt;span class="na"&gt;ref=&lt;/span&gt;&lt;span class="s"&gt;"hd"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/bean&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/beans&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Let’s run our application.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;00:37:43.878 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'hd'
00:37:43.882 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'laptop'
HitachiHD: saveData
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So basically, we injected &lt;code&gt;HitachiHD&lt;/code&gt; bean into our laptop object through its setter method.&lt;/p&gt;

&lt;p&gt;This is called setter injection.&lt;/p&gt;

&lt;h2&gt;
  
  
  Injecting Literal Values through setters
&lt;/h2&gt;

&lt;p&gt;Let’s say we want to inject some hard-coded value into our object. How do we do that?&lt;/p&gt;

&lt;p&gt;Well, we can leverage the setter methods for the literal value we want to inject and pass it in &lt;code&gt;applicationContext.xml&lt;/code&gt; file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;bean&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"hd"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"com.learningspring.demo.src.harddisk.HitachiHD"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;bean&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"laptop"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"com.learningspring.demo.src.laptop.Laptop"&lt;/span&gt; &lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;property&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"hardDisk"&lt;/span&gt; &lt;span class="na"&gt;ref=&lt;/span&gt;&lt;span class="s"&gt;"hd"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;property&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"brandName"&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"Apple"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/bean&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;ApplicationContext&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ClassPathXmlApplicationContext&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"applicationContext.xml"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="nc"&gt;Laptop&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getBean&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"laptop"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Laptop&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;saveData&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getBrandName&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
        &lt;span class="nc"&gt;SpringApplication&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;DemoApplication&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="mo"&gt;00&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;48&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;23.773&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="no"&gt;DEBUG&lt;/span&gt; &lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;springframework&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;beans&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;factory&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;support&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;DefaultListableBeanFactory&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nc"&gt;Creating&lt;/span&gt; &lt;span class="n"&gt;shared&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;singleton&lt;/span&gt; &lt;span class="n"&gt;bean&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;hd&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;
&lt;span class="mo"&gt;00&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;48&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;23.777&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="no"&gt;DEBUG&lt;/span&gt; &lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;springframework&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;beans&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;factory&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;support&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;DefaultListableBeanFactory&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nc"&gt;Creating&lt;/span&gt; &lt;span class="n"&gt;shared&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;singleton&lt;/span&gt; &lt;span class="n"&gt;bean&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;laptop&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;
&lt;span class="nl"&gt;HitachiHD:&lt;/span&gt; &lt;span class="n"&gt;saveData&lt;/span&gt;
&lt;span class="nc"&gt;Apple&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Injecting values from properties file
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Create a properties file&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Load properties file in the spring config file&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;brandName = Apple
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Reference values from properties file in Java code. We can access it through &lt;code&gt;${variable_name}&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;beans&lt;/span&gt; &lt;span class="na"&gt;xmlns=&lt;/span&gt;&lt;span class="s"&gt;"&amp;lt;http://www.springframework.org/schema/beans&amp;gt;"&lt;/span&gt;
       &lt;span class="na"&gt;xmlns:xsi=&lt;/span&gt;&lt;span class="s"&gt;"&amp;lt;http://www.w3.org/2001/XMLSchema-instance&amp;gt;"&lt;/span&gt;
       &lt;span class="na"&gt;xmlns:context=&lt;/span&gt;&lt;span class="s"&gt;"&amp;lt;http://www.springframework.org/schema/context&amp;gt;"&lt;/span&gt;
       &lt;span class="na"&gt;xsi:schemaLocation=&lt;/span&gt;&lt;span class="s"&gt;"&amp;lt;http://www.springframework.org/schema/beans&amp;gt;
    &amp;lt;http://www.springframework.org/schema/beans/spring-beans.xsd&amp;gt;
    &amp;lt;http://www.springframework.org/schema/context&amp;gt;
    &amp;lt;http://www.springframework.org/schema/context/spring-context.xsd&amp;gt;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;context:annotation-config/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;context:property-placeholder&lt;/span&gt; &lt;span class="na"&gt;location=&lt;/span&gt;&lt;span class="s"&gt;"classpath:application.properties"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!--Defining beans here--&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;bean&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"hd"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"com.learningspring.demo.src.harddisk.HitachiHD"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;bean&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"laptop"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"com.learningspring.demo.src.laptop.Laptop"&lt;/span&gt; &lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;property&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"hardDisk"&lt;/span&gt; &lt;span class="na"&gt;ref=&lt;/span&gt;&lt;span class="s"&gt;"hd"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;property&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"brandName"&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"${brandName}"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/bean&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/beans&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  That's it, folks
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fly37n6knif8fv3bhhe8x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fly37n6knif8fv3bhhe8x.png" alt="Coding Chronicles logo" width="800" height="457"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you like these posts, &lt;strong&gt;do subscribe to the &lt;a href="https://codingchronicles.adityakarad.com/newsletter" rel="noopener noreferrer"&gt;newsletter&lt;/a&gt;&lt;/strong&gt;. You'll be the first to know when a new blog post is released on Coding Chronicles.&lt;/p&gt;

</description>
      <category>performance</category>
      <category>architecture</category>
      <category>networking</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>ER Model Explained — DBMS Concepts | Coding Chronicles</title>
      <dc:creator>Aditya Karad</dc:creator>
      <pubDate>Sun, 12 Feb 2023 04:07:29 +0000</pubDate>
      <link>https://forem.com/itskarad/er-model-explained-dbms-concepts-coding-chronicles-n8c</link>
      <guid>https://forem.com/itskarad/er-model-explained-dbms-concepts-coding-chronicles-n8c</guid>
      <description>&lt;h1&gt;
  
  
  &lt;strong&gt;What is an Entity-Relationship Model (ER Model)&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;An ER Model is a conceptual view of your database. It’s kind of a block diagram to logically visualise your database.&lt;/p&gt;

&lt;p&gt;An ER model is used to represent the database structure or architecture of a system.&lt;/p&gt;

&lt;p&gt;ER model consists of various components:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Entity&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Attributes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Relationships&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  Entity
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Entity&lt;/strong&gt; is an object with a physical or conceptual existence.&lt;/p&gt;

&lt;p&gt;It’s something that’s relevant to our database. For example, if we’re designing a school database, a student or a teacher (physical existence) is an entity.&lt;/p&gt;

&lt;p&gt;A course taught at the school can also be an entity (conceptual existence)&lt;/p&gt;

&lt;p&gt;Entity is represented by a rectangle in a ER model diagram&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsoh3p9iou41aqip4ry0s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsoh3p9iou41aqip4ry0s.png" alt="Entity in an ER Model" width="800" height="380"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Attribute
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Attribute&lt;/strong&gt; is a property of an entity.&lt;/p&gt;

&lt;p&gt;For example, a student (an entity) has various attributes like height, weight, blood group, class, and more.&lt;/p&gt;

&lt;p&gt;Attribute is represented by an eclipse or oval in a ER model diagram.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faksugxtn1nu2epq6f8e6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faksugxtn1nu2epq6f8e6.png" alt="Attribute in an ER Model" width="800" height="466"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Types of Attributes
&lt;/h2&gt;

&lt;p&gt;There are many different types of attributes, so the most commonly used terms are below:&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Attribute
&lt;/h3&gt;

&lt;p&gt;A key attribute is used to uniquely identify one entity instance from another.&lt;/p&gt;

&lt;p&gt;It represents a primary key of that entity.&lt;/p&gt;

&lt;p&gt;It’s represented by an oval with the text underlined.&lt;/p&gt;

&lt;p&gt;For an entity like Student, Student ID can be key attribute which can uniquely identify a student.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff10xxxw64wg0ewgb7ftk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff10xxxw64wg0ewgb7ftk.png" alt="Key Attribute in an ER Model" width="800" height="469"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Composite Attribute
&lt;/h3&gt;

&lt;p&gt;An attribute that is composed of multiple attributes is called a composite attribute.&lt;/p&gt;

&lt;p&gt;Here’s how a composite attribute is represented:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F53g0l43dhe6baj6ltv9w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F53g0l43dhe6baj6ltv9w.png" alt="Composite attribute in an ER Model" width="800" height="611"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Multivalued Attribute
&lt;/h3&gt;

&lt;p&gt;An attribute which has more than one value is called a multivalued attribute.&lt;/p&gt;

&lt;p&gt;It’s represented by a double oval in the ER diagram.&lt;/p&gt;

&lt;h3&gt;
  
  
  Derived Attribute
&lt;/h3&gt;

&lt;p&gt;An attribute which can be derived from another is called a derived attribute.&lt;/p&gt;

&lt;p&gt;It’s represented by an oval with dashed lines in the ER diagram.&lt;/p&gt;

&lt;h1&gt;
  
  
  Relationship
&lt;/h1&gt;

&lt;p&gt;A relationship describes the relation between two entities.&lt;/p&gt;

&lt;p&gt;It’s represented by a diamond or rhombus in the ER diagram.&lt;/p&gt;

&lt;p&gt;Oh, and in case you haven’t noticed already, straight lines are used to link attributes to entities and an entity to its relationship.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcswknv31rvvcndojlxoi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcswknv31rvvcndojlxoi.png" alt="Relationship in an ER Model" width="800" height="507"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Relationship Table
&lt;/h1&gt;

&lt;p&gt;A relationship table contains the mapping between two entities of a relationship.&lt;/p&gt;

&lt;p&gt;It also gives us more information of the type of relationship between two entities.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;employee_id&lt;/th&gt;
&lt;th&gt;project_id&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Here,&lt;code&gt;employee_id&lt;/code&gt; is a foreign key referencing the primary key of &lt;code&gt;employee&lt;/code&gt; table&lt;/p&gt;

&lt;p&gt;AND&lt;/p&gt;

&lt;p&gt;&lt;code&gt;project_id&lt;/code&gt; is a foreign key referencing the primary key of &lt;code&gt;project&lt;/code&gt; table.&lt;/p&gt;

&lt;h1&gt;
  
  
  Types of Relationships
&lt;/h1&gt;

&lt;p&gt;The &lt;strong&gt;number of times an entity of an entity set participates in a relationship&lt;/strong&gt; set is known as &lt;strong&gt;cardinality&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;On the basis of &lt;strong&gt;cardinality&lt;/strong&gt;, relationships can be of different types:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;One-to-One (1-1)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;One-to-Many (1-M)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Many-to-One (M-1)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Many-to-Many (M-N)&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  One-to-One relationship
&lt;/h3&gt;

&lt;p&gt;When each entity in an entity set can take part only once in the relationship, the relationship is said to be one-to-one type of relationship.&lt;/p&gt;

&lt;p&gt;Assuming an ideal world where a person is married to only one person, we can say that a male is married to only one female. Similarly, a female is also married to only one male.&lt;/p&gt;

&lt;p&gt;This is an example of a one-to-one relationship.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxlwpkg9rwb7n30594vqh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxlwpkg9rwb7n30594vqh.png" alt="One-to-One relationship in an ER Model" width="800" height="572"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;relationship&lt;/code&gt; table in a one-to-one relationship looks like:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;male_id&lt;/th&gt;
&lt;th&gt;female_id&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Here, since any &lt;code&gt;male_id&lt;/code&gt; as well as &lt;code&gt;female_id&lt;/code&gt; are unique, we can use either as a primary key for &lt;code&gt;relationship&lt;/code&gt; table.&lt;/p&gt;

&lt;p&gt;&amp;lt;aside&amp;gt; 💡 To save space, we can also merge &lt;code&gt;male&lt;/code&gt; and &lt;code&gt;relationship&lt;/code&gt; tables, since the primary key for both is &lt;code&gt;male_id&lt;/code&gt;. We can simply add a column to &lt;code&gt;employee&lt;/code&gt; table named &lt;code&gt;female_id&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Similarly, we can also merge &lt;code&gt;female&lt;/code&gt; and &lt;code&gt;relationship&lt;/code&gt; table.&lt;/p&gt;

&lt;p&gt;&amp;lt;/aside&amp;gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  One-to-Many relationship
&lt;/h3&gt;

&lt;p&gt;When one entity in an entity set can take part only once in the relationship and the other can take part more than once, the relationship is said to be one-to-many type of relationship.&lt;/p&gt;

&lt;p&gt;Consider an e-commerce store like Amazon. An Amazon customer can place multiple orders, but an order can only belong to one customer.&lt;/p&gt;

&lt;p&gt;This is an example of a one-to-many relationship.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4kpje7rrmf8bfybs5dvk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4kpje7rrmf8bfybs5dvk.png" alt="One-to-Many relationship in an ER Model" width="800" height="560"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;relationship&lt;/code&gt; table in a one-to-many relationship looks like:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;customer_id&lt;/th&gt;
&lt;th&gt;order_id&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Here, since any &lt;code&gt;order_id&lt;/code&gt; is unique, we can use &lt;code&gt;order_id&lt;/code&gt; as a primary key for &lt;code&gt;relationship&lt;/code&gt; table.&lt;/p&gt;

&lt;p&gt;Since there can be duplicate &lt;code&gt;customer_id&lt;/code&gt; in this table, we cannot merge it with &lt;code&gt;customers&lt;/code&gt; table.&lt;/p&gt;

&lt;p&gt;We can merge this table with &lt;code&gt;orders&lt;/code&gt; table.&lt;/p&gt;

&lt;h3&gt;
  
  
  Many-to-One relationship
&lt;/h3&gt;

&lt;p&gt;The definition for Many-to-One relationship is the same as One-to-Many relationship.&lt;/p&gt;

&lt;p&gt;Consider the example of privately-owned cars. An individual can own multiple cars, but a car has only one owner.&lt;/p&gt;

&lt;p&gt;This is an example of a many-to-one relationship.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj0ywkw8ll91ekdcbprz1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj0ywkw8ll91ekdcbprz1.png" alt="Many-to-One relationship in an ER Model" width="800" height="557"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Opposite of a one-to-many type of relationship, we can use &lt;code&gt;individual_id&lt;/code&gt; as a primary key for the relationship table.&lt;/p&gt;

&lt;p&gt;Similarly, we can merge the relationship table with the &lt;code&gt;individuals&lt;/code&gt; table, but not &lt;code&gt;cars&lt;/code&gt; table.&lt;/p&gt;

&lt;h3&gt;
  
  
  Many-to-Many relationship
&lt;/h3&gt;

&lt;p&gt;When each entity in an entity set can take part more than once in the relationship, the relationship is said to be Many-to-Many type of relationship.&lt;/p&gt;

&lt;p&gt;In a corporate environment, an employee can be assigned to multiple projects, and a project can also be assigned to multiple employees.&lt;/p&gt;

&lt;p&gt;This is an example of a many-to-many relationship.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbe84kqexlf44ye1sdb71.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbe84kqexlf44ye1sdb71.png" alt="Many-to-Many relationship in an ER Model" width="800" height="599"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;relationship&lt;/code&gt; table in a many-to-many relationship looks like:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;employee_id&lt;/th&gt;
&lt;th&gt;project_id&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Here, &lt;code&gt;employee_id&lt;/code&gt; as well as &lt;code&gt;project_id&lt;/code&gt; can repeat in the table.&lt;/p&gt;

&lt;p&gt;But a combination of &lt;code&gt;employee_id&lt;/code&gt; and &lt;code&gt;project_id&lt;/code&gt; is unique in this table. We can use &lt;code&gt;employee_id&lt;/code&gt; + &lt;code&gt;project_id&lt;/code&gt; as a primary key for this table.&lt;/p&gt;

&lt;p&gt;We cannot reduce this table by merging it with either of the individual tables.&lt;/p&gt;

&lt;h1&gt;
  
  
  That's it, folks!
&lt;/h1&gt;

&lt;p&gt;Learning about database management systems (DBMS) is crucial for developers as it improves data management skills, enhances problem-solving abilities, and helps with database design.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you're looking to deepen your knowledge or learn Database Management Systems from scratch, following the&lt;/strong&gt; &lt;a href="https://codingchronicles.adityakarad.com/series/dbms-concepts" rel="noopener noreferrer"&gt;&lt;strong&gt;Coding Chronicles DBMS series&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;is the perfect way to do it.&lt;/strong&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Coding Chronicles Newsletter
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjcw5xc8wdvz4vwktvw0d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjcw5xc8wdvz4vwktvw0d.png" alt="Image description" width="800" height="457"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you like these posts, do subscribe to the newsletter. You'll be the first to know when a new blog post is released on &lt;a href="https://codingchronicles.adityakarad.com" rel="noopener noreferrer"&gt;Coding Chronicles&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>github</category>
      <category>opensource</category>
      <category>siliconvalley</category>
    </item>
    <item>
      <title>Setting up CI/CD Pipeline for a React app using Travis CI</title>
      <dc:creator>Aditya Karad</dc:creator>
      <pubDate>Sun, 22 Jan 2023 10:24:01 +0000</pubDate>
      <link>https://forem.com/itskarad/setting-up-cicd-pipeline-for-a-react-app-using-travis-ci-o4</link>
      <guid>https://forem.com/itskarad/setting-up-cicd-pipeline-for-a-react-app-using-travis-ci-o4</guid>
      <description>&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;In this tutorial, we will set up a CI/CD pipeline for a simple React application with the help of Travis-CI. Travis-CI works best with Github, so we will use GitHub in this tutorial.&lt;/p&gt;

&lt;h1&gt;
  
  
  Pre-requisites
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Create a GitHub account.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a Travis-CI account and link it to your GitHub account.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Youll need to have &lt;a href="https://nodejs.org/en/" rel="noopener noreferrer"&gt;Node &amp;gt;= 14.0.0 and npm &amp;gt;= 5.6&lt;/a&gt; on your machine.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Initialize a React app
&lt;/h1&gt;

&lt;p&gt;Lets create a simple react app. We will use create-react-app, which provides a nice environment for building a single-page application in React.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx create-react-app travis-ci-react

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can start our application through &lt;code&gt;npm start&lt;/code&gt; command in the terminal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Adding &lt;code&gt;.travis.yml&lt;/code&gt; file
&lt;/h2&gt;

&lt;p&gt;Add a &lt;code&gt;.travis.yml&lt;/code&gt; file to the react project at the root level.&lt;/p&gt;

&lt;h3&gt;
  
  
  What does &lt;code&gt;.travis.yml&lt;/code&gt; file do?
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;.travis.yml&lt;/code&gt; will help us configure our applications CI-CD pipeline.&lt;/p&gt;

&lt;p&gt;Travis only runs builds on the commits you push after youve added a &lt;code&gt;.travis.yml&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqe6s0kc5sv2630vi2mo0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqe6s0kc5sv2630vi2mo0.png" alt="Project structure of our React application with a .travis.yml file." width="524" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now lets set some properties in &lt;code&gt;travis.yml&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;Parameters to provide:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;language&lt;/code&gt;: Provide the programming language for your project. For our case, its &lt;code&gt;node_js&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;version&lt;/code&gt;: Provide the version of the programming language for your application. I have observed that if you dont provide a version, it automatically picks up v2. This can cause your build to fail since many dependencies require a minimum Node version of 8.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;cache: npm&lt;/code&gt; This will cache your NPM dependencies for the next run. Note that &lt;code&gt;npm install&lt;/code&gt; will still run on every build and will update/install any new packages added to your &lt;code&gt;package.json&lt;/code&gt; file&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;After this step &lt;code&gt;.travis.yml&lt;/code&gt; file becomes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;language: node_js
node_js:
  - 16
cache: npm

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Hooks provided by Travis CI
&lt;/h2&gt;

&lt;p&gt;Travis provides us with hooks that are run at specific points in time during the build. These hooks are (in chronological order):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;before_install&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;install&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;before_script&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;script&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;after_success&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;after_failure&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;after_script&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;before_deploy&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;deploy&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;after_deploy&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This provides a lot of flexibility for custom requirements! Lets say you want to notify your developer about a failed Travis build. You can utilize the &lt;code&gt;after_failure&lt;/code&gt; hook to do so.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;script&lt;/code&gt; and &lt;code&gt;install&lt;/code&gt; hooks
&lt;/h2&gt;

&lt;p&gt;Since we know we want to install NPM dependencies for our React project before we test or build it, we should add &lt;code&gt;npm install&lt;/code&gt; as an install script.&lt;/p&gt;

&lt;p&gt;Since we also want to test our changes, we should add a &lt;code&gt;npm test&lt;/code&gt; as a script.&lt;/p&gt;

&lt;p&gt;After testing we can build our react app through &lt;code&gt;npm run build&lt;/code&gt; script.&lt;/p&gt;

&lt;p&gt;Adding these three changes, our &lt;code&gt;travis.yml&lt;/code&gt; file becomes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;language: node_js
node_js:
  - 16
cache: npm
install:
    - npm install
script:
  - npm test
  - npm run build

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Using GitHub Pages in &lt;code&gt;deploy&lt;/code&gt; hook
&lt;/h2&gt;

&lt;p&gt;Lets leverage the &lt;code&gt;deploy&lt;/code&gt; hook to deploy our react app to GitHub Pages.&lt;/p&gt;

&lt;p&gt;But before that, make sure you have set up and enabled Github pages: &lt;a href="https://docs.github.com/en/pages/getting-started-with-github-pages/creating-a-github-pages-site" rel="noopener noreferrer"&gt;Follow this guide!&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You also need to &lt;a href="https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token" rel="noopener noreferrer"&gt;create a personal access token&lt;/a&gt; from GitHub with the &lt;code&gt;repo&lt;/code&gt; scope. We will require this token for authorizing Github Pages deployments from Travis. Copy this token and add it as an &lt;a href="https://docs.travis-ci.com/user/environment-variables/#defining-variables-in-repository-settings" rel="noopener noreferrer"&gt;environment variable in Travis CI&lt;/a&gt; named &lt;code&gt;GITHUB_TOKEN&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp4jwvtter9iw24h8c206.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp4jwvtter9iw24h8c206.png" alt="Scopes for a personal token in Github settings" width="537" height="245"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6c3lu362b21id5aubmub.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6c3lu362b21id5aubmub.png" alt="Adding environment variable in Travis-CI dashboard" width="759" height="188"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now our resulting &lt;code&gt;.travis.yml&lt;/code&gt; file is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;language: node_js
node_js:
  - 16
cache: npm
install:
    - npm install
script:
  - npm test
  - npm run build

deploy:
 provider: pages
 skip_cleanup: true
 github_token: $GITHUB_TOKEN
 local_dir: build
 on:
   branch: master

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Setting homepage in &lt;code&gt;package.json&lt;/code&gt; file
&lt;/h3&gt;

&lt;p&gt;You also need to make a small tweak in &lt;code&gt;package.json&lt;/code&gt; file before pushing your code. Make sure you override &lt;code&gt;homepage&lt;/code&gt; property in &lt;code&gt;package.json&lt;/code&gt; file and set it to the URL where your project is going to be hosted.&lt;/p&gt;

&lt;p&gt;If youre deploying to GitHub Pages, then the URL will be &lt;code&gt;https://&amp;lt;YOUR_GITHUB_USERNAME.github.io/&amp;lt;REPO_NAME&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;If youre curious as to why we do this, check &lt;a href="https://stackoverflow.com/a/70749100" rel="noopener noreferrer"&gt;this&lt;/a&gt; out.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flf7dlx6qxhdy577ph3tv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flf7dlx6qxhdy577ph3tv.png" alt="Changes in package.json file" width="728" height="225"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Committing changes to Github and triggering a Travis CI build
&lt;/h2&gt;

&lt;p&gt;Lets commit these changes and push them to a GitHub repository.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu19hn2yhwrw93v1odjfk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu19hn2yhwrw93v1odjfk.png" alt="Github repository after pushing code" width="800" height="341"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Travis CI Build Results
&lt;/h3&gt;

&lt;p&gt;If your TravisCI account is linked to your GitHub account, a build automatically gets triggered when you push a &lt;code&gt;.travis.yml&lt;/code&gt; file. You can view this in Actions tab.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F56lgpy65hj6vy4c3f9h6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F56lgpy65hj6vy4c3f9h6.png" alt="Actions tab of the same repository" width="800" height="346"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can also view the results of any single build by clicking it:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0bnbij65ao7jgkco4v1y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0bnbij65ao7jgkco4v1y.png" alt="Selecting any build to view its result" width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Similarly, you can also head to your TravisCI dashboard and see the build results.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwvno93vz9wi2mm5kpka4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwvno93vz9wi2mm5kpka4.png" alt="Travis-CI dashboard build result (successful)" width="800" height="359"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;If your build is successful, you can head over to your GitHub Pages URL and see the project deployed!&lt;/p&gt;

&lt;p&gt;For example: here is mine: &lt;a href="https://itskarad.github.io/travis-ci-react/" rel="noopener noreferrer"&gt;https://itskarad.github.io/travis-ci-react/&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Source code of the project
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://github.com/itsKarad/travis-ci-react" rel="noopener noreferrer"&gt;🔗 Source code on GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://itskarad.github.io/travis-ci-react/" rel="noopener noreferrer"&gt;🔗 Github Page&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Some more things
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Default commands used by Travis CI
&lt;/h2&gt;

&lt;p&gt;Travis already provides some default scripts:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Travis has a default install script for Nodejs projects as &lt;code&gt;npm install&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Travis has a default build script for Nodejs projects as: &lt;code&gt;npm test&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Hence we need not add the &lt;code&gt;install: npm install&lt;/code&gt; since its automatically run by Travis for NodeJS projects.&lt;/p&gt;

&lt;p&gt;Similarly, we need not add the &lt;code&gt;script: npm test&lt;/code&gt; as well.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;language: node_js
node_js:
  - 16
cache: npm
script:
  - npm run build

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>githubcopilot</category>
      <category>claude</category>
      <category>ai</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Using Notion as a CMS for a blog for free</title>
      <dc:creator>Aditya Karad</dc:creator>
      <pubDate>Sat, 21 Jan 2023 03:24:33 +0000</pubDate>
      <link>https://forem.com/itskarad/using-notion-as-a-cms-for-a-blog-for-free-4jcc</link>
      <guid>https://forem.com/itskarad/using-notion-as-a-cms-for-a-blog-for-free-4jcc</guid>
      <description>&lt;h2&gt;
  
  
  Why to use Notion as your CMS?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://notion.so" rel="noopener noreferrer"&gt;Notion&lt;/a&gt; is a great tool for writing. It supports markdown, images, layouts, videos, embeds, bookmarks, tables and databases. It’s like the modern day Microsoft Word.&lt;/p&gt;

&lt;p&gt;I recently started my &lt;a href="https://codingchronicles.adityakarad.com/" rel="noopener noreferrer"&gt;blog&lt;/a&gt;, and coded it myself. But I soon realised that my CMS lacked many features that Notion had. So I decided to use Notion as my CMS. &lt;/p&gt;

&lt;h2&gt;
  
  
  Solution
&lt;/h2&gt;

&lt;p&gt;I searched online for solutions and found the following Github repository. It allows direct deployment of a Website to any cloud providers like Heroku, Vercel, Netlify and many others.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/craigary/nobelium" rel="noopener noreferrer"&gt;https://github.com/craigary/nobelium&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Using this repository, I was able to create a &lt;a href="https://codingchronicles.adityakarad.com/" rel="noopener noreferrer"&gt;blog&lt;/a&gt; and deploy it to Vercel.&lt;/p&gt;

&lt;p&gt;You don’t need any NextJS experience to do it yourself (because I myself don’t know NextJS!). Just follow the README file steps and you can set it up yourself!&lt;/p&gt;

</description>
      <category>offers</category>
    </item>
  </channel>
</rss>
